我有这堂课:
public abstract class AbstractIncomingCall {
/*
class properties
*/
public void changeStatus(/*some parameters*/){
//store parameters in class properties
isValid();
}
protected abstract boolean isValid();
}
...由本课程扩展:
public class IncomingCallImpl extends AbstractIncomingCall{
//I override the parent's method
public void changeStatus(/*same parameters as parent's method*/) {
super.changeStatus(/*same parameters as parent's method*/);
//do something interesting
}
protected boolean isValid() throws StatusChangeNotOccurredException {
//implement my validation algorithm
}
我想要实现的是确保每当调用changeStatus(/ * some parameters * /)时调用isValid()方法;请注意,isValid()方法仅在具体类中实现,它还使用从父类继承的类属性。 我有没有办法确保调用isValid()而不是调用super? 我非常不喜欢我必须传递参数的事实,我认为我完全走错了方向并且有一种更清洁的方法来实现这一点。 我想在我的代码中保留的是抽象类中的“isValid()调用逻辑”,因为每个调用都需要进行验证,我不能依赖于我将来记住这个:P
提前致谢:]
答案 0 :(得分:14)
听起来您希望changeStatus()遵循模板方法模式。在这种模式中,您在抽象类中定义changeStatus()(如果您不信任人们正确扩展,则将其设置为final),并让它调用所需的方法:
public final void changeStatus()
{
doSomethingSubclassSpecific();
isValid()
}
protected abstract doSomethingSubclassSpecific();
答案 1 :(得分:2)
您无需覆盖changeStatus()
。您非常接近实现Template Method设计模式。
答案 2 :(得分:2)
您可以将changeStatus设为final,并向其添加对可以覆盖的customChangeStatus方法的调用。 如下所示:
公共抽象类AbstractIncomingCall {
/*
class properties
*/
public final void changeStatus(/*some parameters*/){
//store parameters in class properties
isValid();
customChangeStatus();
}
protected abstract void customChangeStatus();
protected abstract boolean isValid();
}
您甚至可以为customChangeStatus实现一个空方法,因此您不需要始终实现它。 使用changeStatus中的final,您确信在调用类时这将是逻辑。您仍然可以灵活地为其添加自定义行为。
答案 3 :(得分:0)
我建议使用合成而不是继承。事情应该变得更加明显。