2012-06-07 81 views
4

我正在擴展一個我無法直接修改的現有庫(我們稱之爲Lib)。如何更改Scala中繼承方法的訪問級別

有沒有什麼辦法可以讓Lib專用的方法使它們不能在子類之外訪問?

例如,如果我有:

class A extends Lib { 
    def fun(i: int) = someLibFunction(i) //someLibFunction is inherited from Lib 
} 

我如何才能在一塊someLibFunction私人,儘管它是公共/在庫保護?

回答

10

這將打破面向對象編程的基礎 - 您可以在任何需要超類的地方使用子類(多態)。

如果允許縮小的方法(例如,從publicprivate)客戶端代碼接收的Lib一個實例的可見性將不會被允許接收A extends Lib。客戶端代碼預計someLibFunction()可以訪問,並且子類不能更改該合同。這就是說Scala和任何面嚮對象語言都不允許在子類化時縮小任何方法的可見性。請注意,擴大可見度(例如從protectedpublic是完全可能的)。

換句話說,你不是擴展現有的API(庫)。您正在創建具有不同合約的完全不同的API(庫)。

最後一個例子:您有一個Vehicle類,它有一個capacity()並且可以drive()Car可以通過增加一些新功能(如refuel())來擴展Vehicle。但Container不能延伸Vehicle並隱藏駕駛能力。 Container包含Vehicle(反之亦然),也可能有ContainerVehicle共同的父母,如CanHoldCargo

+0

如果我想做相反的事,該怎麼辦?也就是說,要公開一個繼承的私人或受保護的?可能嗎?怎麼樣? – erdavila