【问题标题】:Call super class method automatically自动调用超类方法
【发布时间】:2019-08-04 06:31:17
【问题描述】:

考虑下面的类

class A{
    public void init(){
        //do this first;
    }
    public void atEnd(){
        //do this after init of base class ends
    }
}

class B1 extends A{

    @Override
    public void init()
    {
        super.init();
        //do new stuff.
        //I do not want to call atEnd() method here...
    }
}

我有几个已经开发的 B1、B2、... Bn 子类。它们都扩展了 A 类。如果我想在所有这些中添加新功能,最好的方法是在 A 类中的方法中定义它。但条件是该方法应该总是在之前自动调用子类的 init() 方法结束。 这样做的一种基本方法是在子类的 init() 方法的末尾再次添加 atEnd() 方法调用。但是有没有其他方法可以巧妙地做到这一点?

【问题讨论】:

    标签: java inheritance


    【解决方案1】:

    制作init()final,并为人们提供一个单独的方法来覆盖中间的init()调用:

    class A{
        public final void init(){
            //do this first;
        }
    
        protected void initCore() { }
    
        public void atEnd(){
            //do this after init of base class ends
        }
    }
    
    class B1 extends A{
    
        @Override
        protected void initCore()
        {
            //do new stuff.
        }
    }
    

    【讨论】:

      【解决方案2】:

      实现此目的的一种方法是将init() 设为final,并将其操作委托给第二个可覆盖的方法:

      abstract class A {
        public final void init() {
          // insert prologue here
          initImpl();
          // insert epilogue here
        }
        protected abstract void initImpl();
      }
      
      class B extends A {
        protected void initImpl() {
          // ...
        }
      }
      

      每当有人调用init()时,序言和尾声都会自动执行,派生类不必做任何事情。

      【讨论】:

        【解决方案3】:

        另一个想法是编织一个方面。在切入点添加之前和之后的建议。

        【讨论】:

        • 如果这是关于保护类不变量,AOP 将是一个非常糟糕的解决方案。
        • 这是关于“做事”的;没有提到不变量。根据提供的信息,我不确定“非常差”是否合适。
        【解决方案4】:

        其他答案是合理的解决方法,但要解决确切的问题:不,没有办法自动执行此操作。您必须显式调用super.method()

        【讨论】:

          猜你喜欢
          • 2011-04-16
          • 2011-03-28
          • 1970-01-01
          • 2012-12-30
          • 1970-01-01
          • 2011-10-24
          • 2014-01-15
          • 1970-01-01
          相关资源
          最近更新 更多