簡體   English   中英

如何從 Java 中的非抽象類調用抽象方法?

[英]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();
        }
    }
}

其他幾點:

  1. 考慮一個用於創建儲蓄或支票賬戶的 AccountFactory(又名虛擬構造函數)
  2. 幻數是一個非常糟糕的主意。 從您的帳戶中取出這些常量並使它們可變。 利率會變化,不是嗎?

您需要一種方法來返回您嘗試應用利息的 BankAccount。

因此,在您的 BankAccounts 列表中,您需要找到該帳戶。 按 ID 或名稱搜索。 從那里,您調用列表中的搜索方法以返回銀行帳戶,然后您可以 .applyInterest 對其進行處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM