我正在扩展一个Lib
无法直接修改的现有库(让我们称之为)。
有什么方法可以使某些方法从Lib
私有中获取,以使它们不能在子类之外访问?
例如,如果我有:
class A extends Lib {
def fun(i: int) = someLibFunction(i) //someLibFunction is inherited from Lib
}
someLibFunction
尽管它在 Lib 中是公共/受保护的,但我如何在 A 中将其设为私有?
我正在扩展一个Lib
无法直接修改的现有库(让我们称之为)。
有什么方法可以使某些方法从Lib
私有中获取,以使它们不能在子类之外访问?
例如,如果我有:
class A extends Lib {
def fun(i: int) = someLibFunction(i) //someLibFunction is inherited from Lib
}
someLibFunction
尽管它在 Lib 中是公共/受保护的,但我如何在 A 中将其设为私有?
这将打破面向对象编程的基本基础——您可以在任何需要超类的地方使用子类(多态性)。
如果允许缩小方法的可见性(例如 from public
to ),则不允许private
接收 的实例的客户端代码接收。客户端代码期望是可访问的,并且子类不能更改该合同。Lib
A extends Lib
someLibFunction()
话虽如此,Scala 和任何面向对象的语言都不允许在子类化时缩小任何方法的可见性。请注意,扩大可见性(例如从protected
到public
是完全可能的)。
换句话说,您没有扩展现有的 API(库)。您正在创建具有不同合同的完全不同的 API(库)。
最后一个例子:你有一个Vehicle
有 acapacity()
和 can的类drive()
。可以通过添加一些新功能Car
来扩展,例如. 但不能扩展和隐藏驱动能力。可以包含(反之亦然),也可能有共同的父母,如.Vehicle
refuel()
Container
Vehicle
Container
Vehicle
Container
Vehicle
CanHoldCargo
当您使用 3rd 方库时,有时最好将其包装在代码中的单个点中。
这将使管理该第 3 方软件中可能的未来更改变得更加容易(如果您选择升级版本)。
自从 Scala 出现以来,这一直是一个很好的做法。
一旦你包装了你的 3rd 方库,你可以很容易地从你自己的代码中屏蔽你不想访问的 API 部分(只是不要给他们一个包装方法/类......)。