我正在扩展一个我无法直接修改的现有库(我们称之为Lib
)。
有没有办法让Lib
私有的某些方法成为私有的,以便它们不能在子类之外访问?
例如,如果我有:
class A extends Lib {
def fun(i: int) = someLibFunction(i) //someLibFunction is inherited from Lib
}
我怎样才能使someLibFunction
在A中私有,尽管它在Lib中是公开/受保护的?
答案 0 :(得分:10)
这将打破面向对象编程的基础 - 你可以在任何预期超类的地方使用子类(多态)。
如果允许缩小方法的可见性(例如从public
到private
),则不允许接收Lib
实例的客户端代码接收{{1 }}。客户端代码期望A extends Lib
可以访问,子类不能更改该合同。
据说,在进行子类化时,Scala和任何面向对象语言都不允许缩小任何方法的可见性。请注意,扩大可见性(例如从someLibFunction()
到protected
是完全可能的。)
换句话说,您不是扩展现有的API(库)。您正在创建一个完全不同的API(库),它具有不同的合同。
最后一个示例:您的public
班级有Vehicle
且可以capacity()
。 drive()
可以通过添加Car
等新功能来扩展Vehicle
。但refuel()
无法扩展Container
并隐藏驾驶功能。 Vehicle
可以包含 Container
(反之亦然),同时Vehicle
和Container
可能有Vehicle
这样的共同父级。< / p>
答案 1 :(得分:0)
当您使用第三方库时,有时最好将其包装在代码中的单个点中。
这样可以更轻松地管理第三方软件的未来可能变更(如果您选择升级版本)。
在Scala之前,这是一个很好的做法。
一旦你包装了第三方库,就可以轻松地从你自己的代码中隐藏你不想访问的API部分(只是不要给它们一个包装方法/类......)。