scala – 由不同包中的类继承受包保护的方法
发布时间:2020-12-16 18:32:42 所属栏目:安全 来源:网络整理
导读:我正处于需要混合另一个包中定义的特征的情况.为了帮助进行测试,此特征中的受保护方法是包限定的.这是一个例子: package A { trait X { protected[A] def method(arg: Int) }}package B { class Y extends A.X { protected[A] def method(arg: Int) { } }}
我正处于需要混合另一个包中定义的特征的情况.为了帮助进行测试,此特征中的受保护方法是包限定的.这是一个例子:
package A { trait X { protected[A] def method(arg: Int) } } package B { class Y extends A.X { protected[A] def method(arg: Int) { } } } 用scalac 2.9.1编译它会产生: test.scala:9: error: A is not an enclosing class protected[A] def method(arg: Int) { } 将类Y中的“protected [A]”更改为任何其他访问修饰符会导致: test.scala:9: error: overriding method method in trait X of type (arg: Int)Unit; method method has weaker access privileges; it should be at least protected[A] override protected def method(arg: Int) { } 我的问题是:假设特质X的定义不能改变,是否有任何改变Y类允许它扩展特征X? (同时保留一定程度的“受保护”访问权限) 如果这是不可能的,还有其他推荐的设计策略来解决这个问题吗? (除了公开’方法’) 解决方法
我最后用适配器解决了这个问题.虽然我无法改变原始特征,但我可以在同一个包中添加另一个特性(但由于其他原因,将类Y放在该包中是没有意义的). Y类中的’adapterMethod’有资格打包B作为实验,但很可能这对我的用例来说是不必要的.以下在scala 2.9.1中编译:
package A { trait X { protected[A] def method(arg: Int) } trait PackageAdapter { protected[A] def method(arg: Int) { adapterMethod(arg) } protected def adapterMethod(arg: Int) } } package B { class Y extends A.X with A.PackageAdapter { protected[B] def adapterMethod(arg: Int) { } } } 我并不为这个解决方案而疯狂,但它并没有那么糟糕.类Y是一个例外情况,因为使用特征X的其余类在包A中(由于许多其他原因,类Y必须在包B中).有更好的想法吗? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |