通过不同包中的类继承受包受保护的方法

时间:2011-12-31 19:05:14

标签: scala

我处于需要混合另一个包中定义的特征的情况。为了帮助进行测试,此特征中的受保护方法是包限定的。这是一个例子:

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? (同时保留一定程度的“受保护”访问权限)

如果无法做到这一点,是否有其他推荐的设计策略可以解决这个问题? (除了公开'方法')

1 个答案:

答案 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中)。有更好的想法吗?