超類是Account,並且我有兩個子類 - CurrentAccount和SavingsAccount。強制繼承的類來定義方法
超類將有一個方法applyInterest(),它將使用由繼承類指定的速率計算興趣。我不知道如何強制一個班級來定義這個。
我能想到的唯一選擇是強制子類實現applyInterest(),並在其中設置速率。
超類是Account,並且我有兩個子類 - CurrentAccount和SavingsAccount。強制繼承的類來定義方法
超類將有一個方法applyInterest(),它將使用由繼承類指定的速率計算興趣。我不知道如何強制一個班級來定義這個。
我能想到的唯一選擇是強制子類實現applyInterest(),並在其中設置速率。
我不知道如果我理解你的問題,但我認爲你可以使用關鍵字abstract
,如果你不希望引入一個interface
public abstract class Account
{
public int applyInterest()
{
return 10 * getInterestRate();
}
abstract protected int getInterestRate();
}
public class CurrentAccount extends Account
{
protected int getInterestRate() { return 2; }
}
public class SavingsAccount extends Account
{
protected int getInterestRate() { return 3; }
}
import static org.junit.Assert.assertTrue;
import org.junit.Test;
public class AccountTest
{
@Test
public void currentAccount()
{
Account ca = new CurrentAccount();
assertTrue(ca.applyInterest()==20);
}
@Test
public void savingsAccount()
{
Account sa = new SavingsAccount();
assertTrue(sa.applyInterest()==30);
}
}
您可以強制子類實現getInterestRate(),如果這是可取的。
最好的解決辦法是將班級帳戶設爲abstract
。 如果你不想以任何理由這樣做(然後,客戶必須實例化),你可以這樣寫:
applyInterest(){
throw new RuntimeException("Not yield implemented");//or another Exception: IllegalState, NoSuchMethodException, etc
}
真的,它不是世界上最好的想法(最好的辦法是讓帳戶爲抽象類),但是當您測試Account的子類並調用applyInterest()時,此異常迫使您在子類中實現此方法。
這只是另一種方式。
確實。用抽象的'interestRate()'方法創建超類抽象。這是一個比在兩個子類中都實現'applyInterest()'更好的設計(子類沒有定義如何應用利率的方式,正如我從問題中理解的那樣)。 – khachik 2010-11-17 11:43:21
因此,每種帳戶都必須實現它自己的interestRate()方法,該方法將包含一行設置費率的行? interestRate()方法甚至可能不被調用,所以速率可能會保持爲零。 – Matt 2010-11-17 11:50:47
建議是,applyInterest()中的超類從有問題的子類中調用getInterestRate()。這允許每個子類指定其利率,但將邏輯保留在一個地方(applyInterest),以防需要更改它(例如,改變舍入行爲)。 – 2010-11-17 12:59:07