016 抽象クラス(基本概念) 005 解答例

// 抽象クラス BankAccount の定義
abstract class BankAccount {
    private double balance; // 残高

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

    // 抽象メソッド deposit
    public abstract void deposit(double amount);

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

    // 残高を取得するメソッド
    public double getBalance() {
        return balance;
    }
}

// 具象クラス SavingsAccount の定義
class SavingsAccount extends BankAccount {
    private double interestRate; // 利率

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

    // deposit メソッドの実装
    @Override
    public void deposit(double amount) {
        double interest = amount * interestRate;
        super.deposit(amount + interest);
        System.out.println("Deposited: $" + amount + ", Interest Earned: $" + interest);
    }

    // withdraw メソッドの実装
    @Override
    public void withdraw(double amount) {
        super.withdraw(amount);
        System.out.println("Withdrawn: $" + amount);
    }
}

// 具象クラス CheckingAccount の定義
class CheckingAccount extends BankAccount {
    private double overdraftFee; // オーバードラフト手数料

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

    // deposit メソッドの実装
    @Override
    public void deposit(double amount) {
        super.deposit(amount);
        System.out.println("Deposited: $" + amount);
    }

    // withdraw メソッドの実装
    @Override
    public void withdraw(double amount) {
        if (amount > getBalance()) {
            double totalAmount = amount + overdraftFee;
            super.withdraw(totalAmount);
            System.out.println("Overdraft Occurred! Withdrawn: $" + amount + ", Overdraft Fee: $" + overdraftFee);
        } else {
            super.withdraw(amount);
            System.out.println("Withdrawn: $" + amount);
        }
    }
}

// メインクラス
public class Main {
    public static void main(String[] args) {
        // SavingsAccount の利用例
        SavingsAccount savingsAccount = new SavingsAccount(1000, 0.05);
        savingsAccount.deposit(500);
        savingsAccount.withdraw(200);
        System.out.println("Savings Account Balance: $" + savingsAccount.getBalance());

        // CheckingAccount の利用例
        CheckingAccount checkingAccount = new CheckingAccount(500, 20);
        checkingAccount.deposit(300);
        checkingAccount.withdraw(800);
        System.out.println("Checking Account Balance: $" + checkingAccount.getBalance());
    }
}

この例では、BankAccount クラスを抽象クラスとして定義し、その中に depositwithdraw という抽象メソッドを宣言しました。それを継承する SavingsAccountCheckingAccount クラスが、それぞれの特有の振る舞いを実装しています。

出力結果:

Deposited: $500.0, Interest Earned: $25.0
Withdrawn: $200.0
Savings Account Balance: $1325.0

Deposited: $300.0
Overdraft Occurred! Withdrawn: $800.0, Overdraft Fee: $20.0
Checking Account Balance: $0.0

各アカウントの操作に対する出力を説明します。

SavingsAccount の利用例:

  1. 500ドルをデポジットし、その結果、利子25ドルが加算されています。
  2. 200ドルを引き出しました。
  3. Savings Accountの残高はデポジットと利子の合計で1325ドルです。

CheckingAccount の利用例:

  1. 300ドルをデポジットしました。
  2. 800ドルを引き出しましたが、残高不足のためオーバードラフトが発生し、手数料20ドルが追加されています。
  3. Checking Accountの残高は0ドルです。

「016 抽象クラス」問題集リスト