【问题标题】:Java: Process statements which are within an overridden methodJava:处理覆盖方法中的语句
【发布时间】:2012-03-07 13:57:41
【问题描述】:

所以我有我的基类 X 和扩展它的类 Y。 我在 X 类中有许多方法,它们在 Y 类中都被覆盖了, 我想在这些方法之一中添加一些语句,即使该方法被覆盖,它们也会被调用,而无需将任何额外代码放入 Y 类中。

有什么办法吗?

public class X
 {
     protected void method()
         {
             // vital statements;
         }
 }

public class Y extends X
 {
     protected void method()
             {
             /* vital statements still need to happen
             * would rather not have to call it
             * in every single class that extends X
             */
             // non vital statement;
         }
 }

【问题讨论】:

    标签: java class methods overriding


    【解决方案1】:

    你需要一个模板方法http://en.wikipedia.org/wiki/Template_method_pattern

    将在模板方法中调用重要语句

    public class X {
      final void template() {
        Vital statement;
        method();
      }
    
      void method() {
        // do something;
      }
    }
    
    public class Y extends X {
      @Override
      void method() {
        // specific code to the class Y
      }
    }
    

    【讨论】:

    • 所以每当我在 Y 中调用 method() 时,它仍然会执行“// 做某事”部分吗?
    • 而不是从Y调用method你应该调用它的template方法(继承自X)
    【解决方案2】:

    执行此操作的常用方法(基本上也是唯一方法)是使用 super 关键字:

         protected void method()
         {
             super.method();
             non vital statement;
         }
    

    我说“基本上只是”是因为还有其他方法可以做到这一点,但它们需要更多的改变。一种技术是使中心方法成为最终方法和公共方法(因此它可以被调用但不能被覆盖),并让它调用受保护的抽象方法(可以被覆盖但不能被调用)。然后人们可以通过重写抽象方法来自定义子类的行为。这称为模板方法模式。

    实现您想要的第三种方法是使用aspects. 使用面向方面的编程,您的“重要语句”可以在运行时或编译时添加到子类方法中,使用一些幕后字节码魔术.这需要一些特殊的工具并为您的构建系统增加一些复杂性,但它的优点是对子类的作者完全不可见。

    【讨论】:

    • 仍然需要代码在每个扩展 X 的单个类中的每个方法中......但这是我的后备
    • “基本上只有这样做的方法”是正确的。真的没有其他选择。
    【解决方案3】:

    不,这是不可能的。你必须找到一种不同的方式来实现你想要的,也许是通过template method。

    【讨论】:

      猜你喜欢
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多