2010-12-04 16 views
37

私は以下のことをしたいが、自己タイプの行はコンパイルされません。この構文が間違っているのですか、これは単なる不可能なのでしょうか?複数のセルフタイプが可能ですか?

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 { ... 

答えて

65

複合タイプの1つの自己タイプを持つことができます。使用

trait C { 
    self: { def aValue: Int 
      def bValue: Int } => 

    def total = aValue + bValue 
} 

class ABC extends C { 
    def aValue = 1 
    def bValue = 1 
} 

はリフレクション:あなたが構造型でそれを行うことができます1つの形質

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 
2

はこれを試してみてください。

しかし、第1に、principle of least powerのために自己タイプを過度に使用すべきではありません。

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

または明示的に両方の方法を入力します:セルフ型を使用する

trait C { 
    def aValue: Int 
    def bValue: Int 

    def total = aValue + bValue 
} 

を質問から

方法は、他のテイトを拡張することによって簡単に追加することができますか?

通常、セルフタイプはクラスで使用されます。これは、特性が望ましいクラスのサブクラスであることを要求するための良い方法です。

トライアットのセルフタイプの使い方もあります:マルチ継承でクラス初期化の順序を操作したいときです。

関連する問題