1

我正在尝试定义一个C扩展一些特征的特征A, B,... 所有特征,C 并且A, B,... 实现一个共同的特征T。TraitC应该T通过调用 Tin A, B,.. 的实现来实现:

trait T{
  def f()
}
trait A extends T{
  def f(){
    print("A")
  }
}
trait B extends T{
  def f(){
    print("B")
  }
}

所需的 trait 行为C如下:

val x=new A with B with C[A,B]{}
x.f()
// should produce output
A
B

在这里我尝试定义特征 C,它给出了编译错误:

trait C[A<:T,B<:T] extends T{
  self:A with B =>
  override def f(){
    // error: A does not name a parent class of trait C
    super[A].f()
    // error: B does not name a parent class of trait C
    super[B].f()
  }
}

我需要在C方法A.f()B.f(). 有什么解决办法吗?

4

1 回答 1

2

如果你想在 trait 中提供一个实现,同时确保子类实现定义,可以通过以下abstract override组合告诉编译器:

trait T {
  def f()
}
trait A extends T {
  abstract override def f() {
    super.f()
    print("A")
  }
}
trait B extends T {
  abstract override def f() {
    super.f()
    print("B")
  }
}

trait C extends T {
  override def f() {
    // do your work here ...
  }
}

val x = new C with A with B
x.f()

要在 mixin-hierarchy 中调用下一个实现,您必须super.f()abstract override方法调用中添加一个调用。因为这样的超级调用需要现有的实现,所以您需要创建的第一件事是C该 mixinsAB. 如果你混入或者编译器会报错C,因为混入层次结构是从左到右执行的,因此看不到实现。ABC

于 2012-12-26T12:42:45.173 回答