多种自我types可能吗?

我想要做下面的事情,但自我types的行只是不编译。 我有这个语法错误,或者这是不可能的?

trait A { def aValue = 1 } trait B { def bValue = 1 } trait C { a : A, b : B => def total = a.aValue + b.bValue } class T extends C with A with B { ... 

你可以有一个复合types的自我types。

尝试这个:

 trait A { def aValue = 1 } trait B { def bValue = 1 } trait C { self: A with B => def total = aValue + bValue } class ABC extends A with B with C 

一个特点,你可以做结构types

 trait C { self: { def aValue: Int def bValue: Int } => def total = aValue + bValue } class ABC extends C { def aValue = 1 def bValue = 1 } 

使用的reflection。

但是,首先,因为权力最小的原则,不要滥用自我types。

从问题的方法可以简单地通过扩展其他tait:

 trait C extends A with B{ def total = aValue + bValue } 

或者明确地键入两个方法:

 trait C { def aValue: Int def bValue: Int def total = aValue + bValue } 

在哪里使用自我types?

自我types通常与类一起使用。 这是性状要求成为所需类的子类的好方法。

还有一个很好的用triate的自我types:当你想操纵多重inheritance的类初始化的顺序时。