如何更改Scala中继承方法的访问级别
发布时间:2020-12-16 18:20:00 所属栏目:安全 来源:网络整理
导读:我正在扩展一个我无法直接修改的现有库(我们称之为Lib). 有没有办法从Lib私有一些方法,以便它们不能在子类之外访问? 例如,如果我有: class A extends Lib { def fun(i: int) = someLibFunction(i) //someLibFunction is inherited from Lib} 尽管它在Lib中
我正在扩展一个我无法直接修改的现有库(我们称之为Lib).
有没有办法从Lib私有一些方法,以便它们不能在子类之外访问? 例如,如果我有: class A extends Lib { def fun(i: int) = someLibFunction(i) //someLibFunction is inherited from Lib } 尽管它在Lib中是公共的/受保护的,但我如何在A中将someLibFunction设为私有? 解决方法
这将打破面向对象编程的基础 – 你可以在任何预期超类的地方使用子类(多态).
如果允许缩小方法的可见性(例如,从公共到私有),则不允许接收Lib实例的客户端代码接收A extends Lib.客户端代码期望someLibFunction()可以访问,子类不能更改该合同. 据说,在进行子类化时,Scala和任何面向对象的语言都不允许缩小任何方法的可见性.请注意,扩大可见性(例如从受保护到公共是完全可能的). 换句话说,您没有扩展现有的API(库).您正在创建具有不同合同的完全不同的API(库). 最后一个例子:你有一个具有capacity()并且可以drive()的Vehicle类.汽车可以通过添加一些新的功能,如加油()来扩展车辆.但是Container不能扩展车辆并隐藏驾驶能力.容器可以包含Vehicle(反之亦然),Container和Vehicle也可能有像CanHoldCargo这样的共同父级. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |