超类是Account,我有两个子类 - CurrentAccount和SavingsAccount。
超类将有一个方法applyInterest(),它将使用继承类指定的速率计算兴趣。我不知道如何强制一个类来定义它。
我能想到的唯一选择是强制子类实现applyInterest(),并在那里设置速率。
答案 0 :(得分: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);
}
}
答案 1 :(得分:2)
如果可以的话,你可以强制子类实现getInterestRate()。
答案 2 :(得分:0)
最佳解决方案是将帐户类设为abstract
。
如果您因任何原因不想这样做(那么,Account必须是可实例化的),您可以写:
applyInterest(){
throw new RuntimeException("Not yield implemented");//or another Exception: IllegalState, NoSuchMethodException, etc
}
真的,这不是世界上最好的主意(最好的想法是将Account作为抽象类),但是当你测试Account的子类并调用applyInterest()时,这个异常强迫你在子类中实现这个方法。
这只是另一种方式。