// 抽象クラス 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
クラスを抽象クラスとして定義し、その中に deposit
と withdraw
という抽象メソッドを宣言しました。それを継承する SavingsAccount
と CheckingAccount
クラスが、それぞれの特有の振る舞いを実装しています。
出力結果:
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 の利用例:
- 500ドルをデポジットし、その結果、利子25ドルが加算されています。
- 200ドルを引き出しました。
- Savings Accountの残高はデポジットと利子の合計で1325ドルです。
CheckingAccount の利用例:
- 300ドルをデポジットしました。
- 800ドルを引き出しましたが、残高不足のためオーバードラフトが発生し、手数料20ドルが追加されています。
- Checking Accountの残高は0ドルです。