018 オブジェクト指向の深化(インターフェイスと抽象クラスの利用) 006 解答例

// BankAccount クラス(抽象クラス)
abstract class BankAccount {
    // メンバー変数
    private String accountNumber;
    private double balance;

    // コンストラクタ
    public BankAccount(String accountNumber, double initialBalance) {
        this.accountNumber = accountNumber;
        this.balance = initialBalance;
    }

    // deposit メソッドの実装
    public void deposit(double amount) {
        if (amount > 0) {
            balance += amount;
            System.out.println("Deposited: $" + amount);
        } else {
            System.out.println("Invalid deposit amount");
        }
    }

    // withdraw メソッドの実装
    public void withdraw(double amount) {
        if (amount > 0 && amount <= balance) {
            balance -= amount;
            System.out.println("Withdrawn: $" + amount);
        } else {
            System.out.println("Invalid withdrawal amount or insufficient funds");
        }
    }

    // 抽象メソッド(サブクラスで実装が必要)
    public abstract void printAccountInfo();
}

// SavingsAccount クラス
class SavingsAccount extends BankAccount {
    // コンストラクタ
    public SavingsAccount(String accountNumber, double initialBalance) {
        super(accountNumber, initialBalance);
    }

    // addInterest メソッドの実装
    public void addInterest() {
        double interestRate = 0.05; // 5%の利息を仮定
        double interest = getBalance() * interestRate;
        deposit(interest);
        System.out.println("Interest added: $" + interest);
    }

    // printAccountInfo メソッドの実装
    @Override
    public void printAccountInfo() {
        System.out.println("Savings Account: " + getAccountNumber() + ", Balance: $" + getBalance());
    }
}

// CheckingAccount クラス
class CheckingAccount extends BankAccount {
    // コンストラクタ
    public CheckingAccount(String accountNumber, double initialBalance) {
        super(accountNumber, initialBalance);
    }

    // applyOverdraftFee メソッドの実装
    public void applyOverdraftFee() {
        double overdraftFee = 20.0; // オーバードラフト手数料を仮定
        withdraw(overdraftFee);
        System.out.println("Overdraft fee applied: $" + overdraftFee);
    }

    // printAccountInfo メソッドの実装
    @Override
    public void printAccountInfo() {
        System.out.println("Checking Account: " + getAccountNumber() + ", Balance: $" + getBalance());
    }
}

この解答例では、BankAccount クラスが口座の共通機能を提供し、SavingsAccount クラスと CheckingAccount クラスがそれぞれ普通預金口座と当座預金口座の機能を具体的に実装しています。サブクラスごとに異なるメソッドが追加され、それぞれの口座の情報を出力する printAccountInfo メソッドも実装されています。

「018 オブジェクト指向の深化」問題集リスト