2013-11-27 34 views
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 

编译器基本拒绝这种说法,RecEnricher1RecEnricher2是不相容的,我非常赞同他。请注意,它使用单个richter进行编译。

因此,而不是写

override type Rec <: Base#Rec with B 

我宁愿说:给我相同类型的录制已经被但增加with X它。我试过

override type Rec <: super.Rec with B 

但它被编译器拒绝'循环别名'错误。

我怎么能这样做?

+0

与编译器达成一致:总是一件好事做:) –

+0

您是否尝试过删除'覆盖在'type'之前?让它简单地'输入Rec <:C'。它应该让你混合所有的特质。 –

+0

@ArseniyZhizhelev,不,它不会编译。目标是在每个混合特征图层中添加新的'with X'。 – Tvaroh

回答

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