我有一个关于Java编程良好实践的问题。

问题是:

我正在重写覆盖在类B中声明的方法。此覆盖的方法将在类C中。层次结构是类C扩展的B,后者扩展了A。
该方法存在于每个类中,如下所示:

class A{
    ...
    public void overrideMe(){ ... }
}
class B extends A{
    public void overrideMe(){
     ...
     ...
     super.overrideMe()
    }
}


这些类对于每个项目都是通用的,由于这些原因,这些项目很多,除非有特殊情况,否则我无法修改此类。

我必须重写方法overrideMe()以在内部添加代码,但是在方法末尾,我仍然需要A类的调用方法。

现在的问题是两个,更好:

1)在类B中创建一个仅调用类A中的方法overrideMe()并扩展overrideMe()的方法:

class B extends A{
 public void callOverrideMeOfSuperClass(){ super.overrideMe(); }
 public void overrideMe(){
     ...
     ...
     super.overrideMe()
    }
 }
class C extends B{
 public void overrideMe(){
     ...
     super.callOverrideMeOfSuperClass()
 }
}


2)在类B中创建一个自定义方法,该方法将包含在类B的overrideMe()中,并且仅对我在类C中的项目扩展:

class B extends A{
 public void customCode(){ (not code inside) }
 public void overrideMe(){
     ...
     customeCode();
     ...
     super.overrideMe()
    }
 }
class C extends B{
 public void customeCode(){
     do something;
 }
}


仅供参考:这些类A和B是更多方法和代码。

好吧,我们必须给予重视的问题:

1)Java的良好编程习惯
2)对代码的影响较小
3)对所有项目的影响较小。这些项目是不同的项目,但是共享相同的基本代码。
4)如果我更改通用代码,则每个项目都要检查此代码,以确保对项目没有影响。

第一个解决方案还是第二个解决方案更好,为什么?

谢谢大家!

RainJoker

最佳答案

通常,期望派生类进行扩展的代码以您呈现的第二种形式实现方法。
这样的方法通常被命名为doOriginalMethodName,因此您要使用doOverrideMe
这样可以确保执行原始代码以及派生代码的行为。

这是一些示例代码:

public class A {

  public void extendMe() {
    // modify internal state
    ...

    // allow extension
    doExtendMe();
  }

  protected void doExtendMe() {
  }
}

public class B extends A {

  @Override
  protected void doExtendMe() {
    // modify state of B
    ...
  }
}

10-07 23:37