你能覆盖 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 {
    // ...
}