我有这门课:
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
提前致谢 :]
解决方法:
听起来你想要changeStatus()遵循模板方法模式.在这种模式中,您在抽象类中定义changeStatus()(如果您不信任人们正确扩展,则将其设置为final),并让它调用所需的方法:
public final void changeStatus()
{
doSomethingSubclassSpecific();
isValid()
}
protected abstract doSomethingSubclassSpecific();
标签:java,inheritance
来源: https://codeday.me/bug/20190712/1443138.html