多种自我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的类初始化的顺序时。