你能覆盖 child 中的超类方法什么也不做吗?
Can you override superclass method in child to do nothing?
我有一个 parent class 和几个 child class。对于 child classes 之一,我不希望变量“旋转”为 0 以外的任何值。覆盖那个 child class 中的方法是不好的做法吗?
public class Parent {
public Parent(double rotation) {
this.rotation = rotation;
}
private double rotation = 0;
public double getRotation() {
return rotation;
}
public void setRotation(double rotation) {
this.rotation = rotation;
}
}
public class RebelChild extends Parent {
public RebelChild () {
super(0);
// TODO Auto-generated constructor stub
}
@Override
public void setRotation(double rotation) {
// do nothing
}
}
如果您发现自己处于这种情况,当存在于 superclass 中的方法不适用于 subclass 时,这表明存在问题class 层次结构的设计。
subclasses 和 superclasses 之间应该存在“是”关系。这意味着 subclass 的实例(例如您示例中的 RebelChild
) 是其 superclass(es) 的 实例: RebelChild
对象 是 Parent
对象。这是 Liskov substitution principle.
如果superclass的其中一种方法不适合subclass,那么你就违反了这个原则。这意味着您不能像对待 Parent
对象那样对待 RebelChild
对象。
如果方法 setRotation
不适用于 RebelChild
对象,则它不应该是 Parent
的子 class。
编程时,您希望尽早发现错误。在编译时显示错误比在运行时显示错误要好得多——这样您会更快地发现错误。因此,最好设计 class 层次结构,使 setRotation
方法在 RebelChild
对象上根本不可用,而不是重写该方法不执行任何操作或抛出异常.
考虑这样的设计:
public class Thing {
// methods that are appropriate for any kind of Thing
}
public class RotatableThing extends Thing {
public double getRotation() { ... }
public void setRotation(double rotation) { ... }
}
// A specific kind of Thing that can be rotated
public class Something extends RotatableThing {
// ...
}
// RebelChild is a Thing that cannot be rotated
public class RebelChild extends Thing {
}
或者,使 Rotatable
成为接口:
public interface Rotatable {
double getRotation();
void setRotation(double rotation);
}
// Something is a Thing that can also be rotated
public class Something extends Thing implements Rotatable {
// ...
}
// RebelChild cannot be rotated so it does not implement Rotatable
public class RebelChild extends Thing {
// ...
}
我有一个 parent class 和几个 child class。对于 child classes 之一,我不希望变量“旋转”为 0 以外的任何值。覆盖那个 child class 中的方法是不好的做法吗?
public class Parent {
public Parent(double rotation) {
this.rotation = rotation;
}
private double rotation = 0;
public double getRotation() {
return rotation;
}
public void setRotation(double rotation) {
this.rotation = rotation;
}
}
public class RebelChild extends Parent {
public RebelChild () {
super(0);
// TODO Auto-generated constructor stub
}
@Override
public void setRotation(double rotation) {
// do nothing
}
}
如果您发现自己处于这种情况,当存在于 superclass 中的方法不适用于 subclass 时,这表明存在问题class 层次结构的设计。
subclasses 和 superclasses 之间应该存在“是”关系。这意味着 subclass 的实例(例如您示例中的 RebelChild
) 是其 superclass(es) 的 实例: RebelChild
对象 是 Parent
对象。这是 Liskov substitution principle.
如果superclass的其中一种方法不适合subclass,那么你就违反了这个原则。这意味着您不能像对待 Parent
对象那样对待 RebelChild
对象。
如果方法 setRotation
不适用于 RebelChild
对象,则它不应该是 Parent
的子 class。
编程时,您希望尽早发现错误。在编译时显示错误比在运行时显示错误要好得多——这样您会更快地发现错误。因此,最好设计 class 层次结构,使 setRotation
方法在 RebelChild
对象上根本不可用,而不是重写该方法不执行任何操作或抛出异常.
考虑这样的设计:
public class Thing {
// methods that are appropriate for any kind of Thing
}
public class RotatableThing extends Thing {
public double getRotation() { ... }
public void setRotation(double rotation) { ... }
}
// A specific kind of Thing that can be rotated
public class Something extends RotatableThing {
// ...
}
// RebelChild is a Thing that cannot be rotated
public class RebelChild extends Thing {
}
或者,使 Rotatable
成为接口:
public interface Rotatable {
double getRotation();
void setRotation(double rotation);
}
// Something is a Thing that can also be rotated
public class Something extends Thing implements Rotatable {
// ...
}
// RebelChild cannot be rotated so it does not implement Rotatable
public class RebelChild extends Thing {
// ...
}