在子类中实现 Setters/Getters 的最佳实践?

Best Practices for Implementing Setters/Getters in Subclasses?

如果我有一个必须保留某些功能的超类,因此需要 setters/getters(我意识到这并不理想,但那不是重点),当我实现一个子类时,我是否应该包含一个调用到子类中的超类' setters/getters 即使我可以在技术上调用它们而无需再次编写代码?

我在下面发布了一个例子来说明我的意思。

class Parent {

   private int x;

   public void myMethod() {
      // Code here.
   }

   public void setX(int y) {
       x = y;
   }

   public int getX() {
       return x;
   }


}

class Child extends Parent {

   @Override 
   public void myMethod() {
      super.myMethod();
      // Different code here.
   }

   // Are the inclusions below really necessary? 
   public void setX(int y) {
       super.setX(y);
   }

   public int getX() {
       super.getX();
   }
}

继承的全部意义在于,如果超类方法满足您的需要,则不必在子类中重新实现方法。只有当子类方法需要做某事时才应该重写 different/more.

should I include a call to the superclass' setters/getters in the subclass

首先,如果您希望 child 可以访问 private int x,请将 private 更改为 protected。

我能想到何时 return/set 不同数据的唯一原因是,例如,子类在设置 x 之前对 y 进行了一些额外的计算。否则,如果您只是委托给 super 方法,那么该定义是不必要的。

如果您需要专门访问父对象的私有字段,请使用超级class 访问器。如果您在子 class 中定义了不同的实例字段,则需要单独的 getter 来访问这些 fields/variables。

否则,只需使用预定义的超级方法,这些方法由所有扩展父 class 的 class 继承。

覆盖方法只调用它们的超级版本是默认情况下没有覆盖的!

换句话说:

@Override
void foo() { super.foo(); }

结果绝对与行为相同......根本没有覆盖该方法。

因此,恰恰相反:您应该考虑将这些 getter 和 setter 设为 final 以防止子类覆盖它们!记录在案:当重写方法时,您 总是 想在这些方法上放置 @Override 注释(这样编译器可以告诉您什么时候您只 think 你正在覆盖一个方法)。