018 オブジェクト指向の深化(ポリモーフィズムの応用) 009 解答例

// 抽象クラス BankAccount
abstract class BankAccount {
    private double balance;

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

    // withdraw メソッド
    public abstract void withdraw(double amount);

    // getBalance メソッド
    public double getBalance() {
        return balance;
    }
}

// SavingsAccount クラス
class SavingsAccount extends BankAccount {
    private double interestRate;

    // コンストラクタ
    public SavingsAccount(double initialBalance, double interestRate) {
        super(initialBalance);
        this.interestRate = interestRate;
    }

    // withdraw メソッドのオーバーライド
    @Override
    public void withdraw(double amount) {
        // 特有の処理(例: 手数料を引いてから引き出し)
        double fee = 0.5;
        double totalAmount = amount + fee;
        if (totalAmount <= getBalance()) {
            // 引き出し可能な場合
            super.withdraw(totalAmount);
        } else {
            System.out.println("Insufficient funds!");
        }
    }
}

// CheckingAccount クラス
class CheckingAccount extends BankAccount {
    private double overdraftLimit;

    // コンストラクタ
    public CheckingAccount(double initialBalance, double overdraftLimit) {
        super(initialBalance);
        this.overdraftLimit = overdraftLimit;
    }

    // withdraw メソッドのオーバーライド
    @Override
    public void withdraw(double amount) {
        // 特有の処理(例: オーバードラフトの範囲内で引き出し)
        if (amount <= getBalance() + overdraftLimit) {
            // 引き出し可能な場合
            super.withdraw(amount);
        } else {
            System.out.println("Insufficient funds!");
        }
    }
}

// Main クラス
public class Main {
    public static void main(String[] args) {
        // 異なる種類の銀行口座のインスタンスを生成
        SavingsAccount savingsAccount = new SavingsAccount(1000, 0.02);
        CheckingAccount checkingAccount = new CheckingAccount(500, 200);

        // 引き出しを行い、結果を表示
        System.out.println("Initial Savings Account Balance: " + savingsAccount.getBalance());
        savingsAccount.withdraw(50);
        System.out.println("Savings Account Balance after Withdrawal: " + savingsAccount.getBalance());

        System.out.println("\nInitial Checking Account Balance: " + checkingAccount.getBalance());
        checkingAccount.withdraw(700);
        System.out.println("Checking Account Balance after Withdrawal: " + checkingAccount.getBalance());
    }
}

このプログラムでは、BankAccount クラスを抽象クラスとして、SavingsAccount クラスと CheckingAccount クラスがそれを継承して withdraw メソッドをオーバーライドしています。main メソッドでは、異なる種類の銀行口座から引き出しを行い、結果を表示しています。

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