2010-11-17 50 views
2

超類是Account,並且我有兩個子類 - CurrentAccount和SavingsAccount。強制繼承的類來定義方法

超類將有一個方法applyInterest(),它將使用由繼承類指定的速率計算興趣。我不知道如何強制一個班級來定義這個。

我能想到的唯一選擇是強制子類實現applyInterest(),並在其中設置速率。

回答

5

我不知道如果我理解你的問題,但我認爲你可以使用關鍵字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); 
    } 
} 
2

您可以強制子類實現getInterestRate(),如果這是可取的。

+0

確實。用抽象的'interestRate()'方法創建超類抽象。這是一個比在兩個子類中都實現'applyInterest()'更好的設計(子類沒有定義如何應用利率的方式,正如我從問題中理解的那樣)。 – khachik 2010-11-17 11:43:21

+0

因此,每種帳戶都必須實現它自己的interestRate()方法,該方法將包含一行設置費率的行? interestRate()方法甚至可能不被調用,所以速率可能會保持爲零。 – Matt 2010-11-17 11:50:47

+0

建議是,applyInterest()中的超類從有問題的子類中調用getInterestRate()。這允許每個子類指定其利率,但將邏輯保留在一個地方(applyInterest),以防需要更改它(例如,改變舍入行爲)。 – 2010-11-17 12:59:07

0

最好的解決辦法是將班級帳戶設爲abstract。 如果你不想以任何理由這樣做(然後,客戶必須實例化),你可以這樣寫:

applyInterest(){ 
throw new RuntimeException("Not yield implemented");//or another Exception: IllegalState, NoSuchMethodException, etc 
} 

真的,它不是世界上最好的想法(最好的辦法是讓帳戶爲抽象類),但是當您測試Account的子類並調用applyInterest()時,此異常迫使您在子類中實現此方法。

這只是另一種方式。