我正在擴展一個我無法直接修改的現有庫(我們稱之爲Lib
)。如何更改Scala中繼承方法的訪問級別
有沒有什麼辦法可以讓Lib
專用的方法使它們不能在子類之外訪問?
例如,如果我有:
class A extends Lib {
def fun(i: int) = someLibFunction(i) //someLibFunction is inherited from Lib
}
我如何才能在一塊someLibFunction
私人,儘管它是公共/在庫保護?
我正在擴展一個我無法直接修改的現有庫(我們稱之爲Lib
)。如何更改Scala中繼承方法的訪問級別
有沒有什麼辦法可以讓Lib
專用的方法使它們不能在子類之外訪問?
例如,如果我有:
class A extends Lib {
def fun(i: int) = someLibFunction(i) //someLibFunction is inherited from Lib
}
我如何才能在一塊someLibFunction
私人,儘管它是公共/在庫保護?
這將打破面向對象編程的基礎 - 您可以在任何需要超類的地方使用子類(多態)。
如果允許縮小的方法(例如,從public
到private
)客戶端代碼接收的Lib
一個實例的可見性將不會被允許接收A extends Lib
。客戶端代碼預計someLibFunction()
可以訪問,並且子類不能更改該合同。這就是說Scala和任何面嚮對象語言都不允許在子類化時縮小任何方法的可見性。請注意,擴大可見度(例如從protected
到public
是完全可能的)。
換句話說,你不是擴展現有的API(庫)。您正在創建具有不同合約的完全不同的API(庫)。
最後一個例子:您有一個Vehicle
類,它有一個capacity()
並且可以drive()
。 Car
可以通過增加一些新功能(如refuel()
)來擴展Vehicle
。但Container
不能延伸Vehicle
並隱藏駕駛能力。 Container
罐包含Vehicle
(反之亦然),也可能有Container
和Vehicle
共同的父母,如CanHoldCargo
。
如果我想做相反的事,該怎麼辦?也就是說,要公開一個繼承的私人或受保護的?可能嗎?怎麼樣? – erdavila