2009-10-21 29 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(); 

然而,目前尚不清楚這應該如何表現。一種可能性是讓它導致運行時錯誤。另一種方法是簡單地允許它,這樣就可以從外部調用一個私有方法,只需轉換到父類即可。這些替代方法都不可接受,所以不允許。

相關問題