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

Ran*_*and 4 scala

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

有没有办法从Libprivate 创建一些方法,以便它们不能在子类之外访问?

例如,如果我有:

class A extends Lib {
    def fun(i: int) = someLibFunction(i) //someLibFunction is inherited from Lib
} 
Run Code Online (Sandbox Code Playgroud)

someLibFunction尽管在Lib中公开/受到保护,我怎样才能在A中私有化?

Tom*_*icz 11

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

如果它被允许来缩小的方法的可见性(例如,从publicprivate)客户端接收代码的一个实例,Lib将不会被允许接收A extends Lib.客户端代码期望someLibFunction()可访问,子类不能更改该合同.

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

换句话说,您没有扩展现有的API(库).您正在创建具有不同合同的完全不同的API(库).

最后一个例子:你有一个Vehicle有a capacity()和can的类drive().Car可以Vehicle通过添加一些新功能来扩展refuel().但Container不能扩展Vehicle和隐藏驾驶能力.Container可以包含 Vehicle(反之亦然),也ContainerVehicle可能有这样共同的父CanHoldCargo.