在子类中实现 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 你正在覆盖一个方法)。
如果我有一个必须保留某些功能的超类,因此需要 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 你正在覆盖一个方法)。