如何更改Scala中继承方法的访问级别

时间:2012-06-07 21:01:11

标签: scala

我正在扩展一个我无法直接修改的现有库(我们称之为Lib)。

有没有办法让Lib私有的某些方法成为私有的,以便它们不能在子类之外访问?

例如,如果我有:

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

我怎样才能使someLibFunction在A中私有,尽管它在Lib中是公开/受保护的?

2 个答案:

答案 0 :(得分:10)

这将打破面向对象编程的基础 - 你可以在任何预期超类的地方使用子类(多态)。

如果允许缩小方法的可见性(例如从publicprivate),则不允许接收Lib实例的客户端代码接收{{1 }}。客户端代码期望A extends Lib可以访问,子类不能更改该合同。

据说,在进行子类化时,Scala和任何面向对象语言都不允许缩小任何方法的可见性。请注意,扩大可见性(例如从someLibFunction()protected是完全可能的。)

换句话说,您不是扩展现有的API(库)。您正在创建一个完全不同的API(库),它具有不同的合同。

最后一个示例:您的public班级有Vehicle且可以capacity()drive()可以通过添加Car等新功能来扩展Vehicle。但refuel()无法扩展Container并隐藏驾驶功能。 Vehicle可以包含 Container(反之亦然),同时VehicleContainer可能有Vehicle这样的共同父级。< / p>

答案 1 :(得分:0)

当您使用第三方库时,有时最好将其包装在代码中的单个点中。

这样可以更轻松地管理第三方软件的未来可能变更(如果您选择升级版本)。

在Scala之前,这是一个很好的做法。

一旦你包装了第三方库,就可以轻松地从你自己的代码中隐藏你不想访问的API部分(只是不要给它们一个包装方法/类......)。