4
这很容易通过示例来解释。我有一个类型Rec
一个Base
特质定义:如何覆盖添加更多mixin的类型成员
trait A
trait B
trait C
trait Base {
type Rec <: A
def foo(r: Rec): Rec = ???
}
现在我想创建“浓缩商”为Base
其使用上压倒方法,并在同一时间做出型Rec
更具体的抽象override修饰符添加一些功能(视在任务的具体执行富集):
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
在Enricher1
和Rec
在Enricher2
是不相容的,我非常赞同他。请注意,它使用单个richter进行编译。
因此,而不是写
override type Rec <: Base#Rec with B
我宁愿说:给我相同类型的录制已经被但增加with X
它。我试过
override type Rec <: super.Rec with B
但它被编译器拒绝'循环别名'错误。
我怎么能这样做?
与编译器达成一致:总是一件好事做:) –
您是否尝试过删除'覆盖在'type'之前?让它简单地'输入Rec <:C'。它应该让你混合所有的特质。 –
@ArseniyZhizhelev,不,它不会编译。目标是在每个混合特征图层中添加新的'with X'。 – Tvaroh