42

为什么在子类中重写方法时降低方法的可见性时编译器会给出错误消息?

4

3 回答 3

65

因为子类的每个实例仍然需要是基类的有效实例(参见Liskov 替换原则)。

如果子类突然失去了基类的一个属性(例如公共方法),那么它将不再是基类的有效替代品。

于 2009-10-21T12:59:53.093 回答
18

因为如果允许这样做,可能会出现以下情况:

Sub 类继承自 Parent 类。Parent 有一个公共方法foo,Sub 将该方法设为私有。现在以下代码可以正常编译,因为声明的类型bar是 Parent:

Parent bar = new Sub();
bar.foo();

然而,目前尚不清楚这应该如何表现。一种可能性是让它导致运行时错误。另一种方法是简单地允许它,这样就可以从外部调用私有方法,只需转换为父类即可。这些替代方案都不可接受,因此是不允许的。

于 2009-10-21T13:04:35.700 回答
1

因为子类型必须可用作其超类型的实例。

于 2009-10-21T13:01:48.957 回答