我有这门课:
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();