我处于需要混合另一个包中定义的特征的情况。为了帮助进行测试,此特征中的受保护方法是包限定的。这是一个例子:
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? (同时保留一定程度的“受保护”访问权限)
如果无法做到这一点,是否有其他推荐的设计策略可以解决这个问题? (除了公开'方法')
答案 0 :(得分:2)
我最后用适配器解决了这个问题。虽然我无法更改原始特征,但我可以在同一个包中添加另一个特性(但由于其他原因,将类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中)。有更好的想法吗?