4

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

有什么方法可以使某些方法从Lib私有中获取,以使它们不能在子类之外访问?

例如,如果我有:

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

someLibFunction尽管它在 Lib 中是公共/受保护的,但我如何在 A 中将其设为私有?

4

2 回答 2

11

这将打破面向对象编程的基本基础——您可以在任何需要超类的地方使用子类(多态性)。

如果允许缩小方法的可见性(例如 from publicto ),则不允许private接收 的实例的客户端代码接收。客户端代码期望是可访问的,并且子类不能更改该合同。LibA extends LibsomeLibFunction()

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

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

最后一个例子:你有一个Vehicle有 acapacity()和 can的类drive()。可以通过添加一些新功能Car来扩展,例如. 但不能扩展和隐藏驱动能力。可以包含(反之亦然),也可能有共同的父母,如.Vehiclerefuel()ContainerVehicleContainer VehicleContainerVehicleCanHoldCargo

于 2012-06-07T21:06:33.437 回答
0

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

这将使管理该第 3 方软件中可能的未来更改变得更加容易(如果您选择升级版本)。

自从 Scala 出现以来,这一直是一个很好的做法。

一旦你包装了你的 3rd 方库,你可以很容易地从你自己的代码中屏蔽你不想访问的 API 部分(只是不要给他们一个包装方法/类......)。

于 2018-05-23T06:12:30.560 回答