加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何更改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这样的共同父级.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读