如何覆盖类型成员添加更多mixins

时间:2013-11-27 22:09:44

标签: scala traits

通过示例更容易解释。我有一个Base特征,它定义了类型Rec

trait A
trait B
trait C

trait Base {
  type Rec <: A
  def foo(r: Rec): Rec = ???
}

现在我想为Base创建'richhers',它在overrode方法上使用抽象覆盖修饰符添加一些功能,同时使类型Rec更具体(取决于任务具体丰富执行) :

trait Enricher1 extends Base {
  override type Rec <: Base#Rec with B
  abstract override def foo(r: Rec): Rec = ??? // uses super.foo
}

trait Enricher2 extends Base {
  override type Rec <: Base#Rec with C
  abstract override def foo(r: Rec): Rec = ??? // uses super.foo
}

问题是:我不能将我的浓缩物混合在一起:

trait Concrete extends Base
trait Custom extends Concrete with Enricher1 with Enricher2

编译器拒绝这种说法基本上Rec中的Enricher1Rec中的Enricher2类型不相容,我非常同意他的看法。请注意,它使用单个richher进行编译。

所以,而不是写

override type Rec <: Base#Rec with B

我宁愿说:给我与Rec已经相同的类型,但是添加with X。我试过了

override type Rec <: super.Rec with B

但是编译器也拒绝了“循环别名”错误。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

如果我正确理解你要做的事情,我认为这是可以做到的:

trait A
trait B
trait C

trait Base {
  type Rec <: A
   def foo(r: Rec): Rec = ???
}

trait Enricher1 extends Base {
  override type Rec <: Base#Rec with C
   abstract override def foo(r: Rec): Rec = ??? // uses super.foo
}
trait Enricher2 extends Enricher1 {
  override type Rec <: Enricher1#Rec with B
  abstract override def foo(r: Rec): Rec = ??? // uses super.foo
}
trait Concrete extends Base
trait Custom extends Concrete with Enricher2