2009-10-21 33 views

回答

65

因为子类的每个实例仍然需要是基类的有效实例(请参阅Liskov substitution principle)。

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

+2

但是,为什么我们不允许覆盖受保护的方法并将其更改为私有方法?由于公共接口仍然是相同的,所以它不会以这种方式破坏LSP。 – Pacerier 2014-08-23 07:32:40

+0

公共接口不会改变,但受保护的。父类中的代码不能访问它自己的血肉和血液:( – Elazar 2015-09-07 22:08:30

1

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

18

因为如果这是允许的,下面的情况是可能的:

从类父类子继承。 Parent有一个公共方法foo,Sub使该方法变为私有。现在,下面的代码将编译很好,因为bar声明的类型是父:

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

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

相关问题