为什么编译器在覆盖子类时减少方法的可见性时会给出错误消息?
答案 0 :(得分:65)
因为子类的每个实例仍然需要是基类的有效实例(参见Liskov substitution principle)。
如果子类突然丢失了基类的一个属性(例如公共方法),那么它将不再是基类的有效替代。
答案 1 :(得分:18)
因为如果允许这样做,可能会出现以下情况:
Class Sub继承自Parent类。 Parent有一个公共方法foo
,Sub将该方法设为私有。现在,下面的代码可以正常编译,因为声明的bar
类型是Parent:
Parent bar = new Sub();
bar.foo();
然而,目前尚不清楚这应该如何表现。一种可能性是让它导致运行时错误。另一种方法是简单地允许它,这样就可以通过转换到父类来从外部调用私有方法。这些替代方案都不可接受,因此不允许。
答案 2 :(得分:1)
因为子类型必须可用作其超类型的实例。