[英]How do I call an abstract method from a non-abstract class in Java?
我有五個班級:
銀行應用:
public class BankApp {
public static void main(String[] args) {
BankDatabase acctDatabase = new BankDatabase();
acctDatabase.createCheckingAccount("Test Name", "123-45-6789", 20000.0f);
acctDatabase.applyInterest();
acctDatabase.print();
}
}
銀行數據庫:
import java.util.ArrayList;
import java.util.Collections;
public class BankDatabase {
ArrayList<BankAccount> list = new ArrayList<>();
public void createCheckingAccount(String name, String ssn, float bal) {
BankAccount account = new CheckingAccount(name, ssn, bal);
list.add(account);
}
public void createSavingsAccount(String name, String ssn, float bal) {
BankAccount account = new SavingsAccount(name, ssn, bal);
list.add(account);
}
public void print() {
Collections.sort(list, (BankAccount a, BankAccount b) -> {
return Float.compare(b.bal, a.bal);
});
for(int i = 0; i < list.size(); i++)
System.out.println(list.get(i));
}
public abstract void applyInterest();
}
銀行賬戶:
public abstract class BankAccount {
protected String name;
protected String ssn;
protected float bal;
private String account;
public BankAccount(String name, String ssn, float bal) {
name = this.name;
ssn = this.ssn;
bal = this.bal;
accountNumber();
System.out.println("Successfully created account for " + name + ". Account Number: " + account);
if(!ssn.matches("^(\\d{3}-?\\d{2}-?\\d{4})$")) {
System.out.println(name + " has an invalid SSN!");
}
System.out.println(name + ", Balance $" + bal);
}
@Override
public String toString() {
return "Name: " + name + ", Account #: " + account + ", Balance: $" + bal;
}
public abstract void applyInterest();
}
支票賬戶:
public class SavingsAccount extends BankAccount {
public SavingsAccount(String name, String ssn, float bal) {
super(name, ssn, bal);
}
@Override
public void applyInterest() {
bal = (float) (bal * 1.05);
}
}
和儲蓄賬戶:
public class CheckingAccount extends BankAccount {
public CheckingAccount(String name, String ssn, float bal) {
super(name, ssn, bal);
}
@Override
public void applyInterest() {
if(bal >= 10000.00) {
bal = (float) ((bal - 10000.00) * 1.02) + 10000;}
}
}
}
我想從 BankApp 調用 applyInterest() 但是我不能,因為 BankDatabase 不是抽象的。 我不能將 BankDatabase 抽象化,因為如果我這樣做了,我就無法實例化 BankDatabase。 所以,我的問題是:如何調用 applyInterest()?
BankDatabase 中的那個方法不應該是抽象的。 我想你想這樣做:
public class BankDatabase {
private List<BankAccount> accounts = new ArrayList<>();
// Add a BankAccount; leave the type creation outside this method.
// Polymorphism is your friend; use it.
public void addAccount(BankAccount account) {
if (account != null) {
this.accounts.add(account);
}
}
public void applyInterest() {
for (BankAccount account : this.accounts) {
account.applyInterest();
}
}
}
其他幾點:
您需要一種方法來返回您嘗試應用利息的 BankAccount。
因此,在您的 BankAccounts 列表中,您需要找到該帳戶。 按 ID 或名稱搜索。 從那里,您調用列表中的搜索方法以返回銀行帳戶,然后您可以 .applyInterest 對其進行處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.