代码之家  ›  专栏  ›  技术社区  ›  Alberto Zaccagni

确保方法被调用

  •  3
  • Alberto Zaccagni  · 技术社区  · 17 年前

    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
        }
    

    是否有一种方法可以确保调用isValid()而不是调用super? 我非常不喜欢这样一个事实,我必须到处传递参数,我认为我完全走错了方向,有一个更干净的方法来实现这一点。 我希望在我的代码中保留抽象类中的“isValid()调用逻辑”,因为每个调用都需要验证,我不能指望我将来记住这一点:P

    提前感谢:]

    4 回复  |  直到 17 年前
        1
  •  14
  •   kdgregory    17 年前

    听起来您希望changeStatus()遵循模板方法模式。在此模式中,您在抽象类中定义changeStatus()(如果您不相信人们能够正确扩展,则将其设置为最终),并让它调用所需的方法:

    public final void changeStatus()
    {
        doSomethingSubclassSpecific();
        isValid()
    }
    
    
    protected abstract doSomethingSubclassSpecific();
    
        2
  •  2
  •   daanish.rumani    17 年前

    changeStatus() . 您非常接近于实现 Template Method 设计模式。

        3
  •  2
  •   Rafael Coutinho    17 年前

    您可以将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可以确保调用类时这是逻辑。您仍然可以灵活地向其添加自定义行为。

        4
  •  0
  •   Tom Hawtin - tackline    17 年前

    我建议使用组合而不是继承。事情应该通过这种方式变得更加明显。