2012-02-22 16 views
2

私は、Scalaでは、次のコードをお持ちの場合:スカラ - 共通の特徴の第二世代の継承

trait A { 
    var yo = 10 
    def get = yo 
} 

trait B extends A { /* makes use of A.get */ } 
trait C extends A { /* makes use of A.get */ } 

trait D extends B with C { /* makes use of A.get */ } 

class E extends D { /* makes use of A.get */ } 

どのようにコンパイラが依存関係をRESOLUTEでしょうか?言い換えれば、2つの異なる形質BおよびCから継承された形質Dおよび対象EのA形質が関連する部分は、単一のものとして扱われなければならず、相続のすべての場合に複製されないことを理解するだろうか?どのようにしても、その状況でコンパイラの考えはどのように見えますか?

答えて

5

スカラ座でのプログラミングのthis章からは、天使によって示唆されているように、我々は次の例があります。

以下のパイプラインに派生 ​​

Cat -> FourLegged -> HasLegs -> Furry -> Animal 

右のものが優先されますが、パイプライン上の他の人の共通の祖先でない限り、彼の先祖も優先されます。これはHasLegsFurryの前に来る理由です。

は最後に、ここにあなたの特定の例のための答えです:

E -> D -> C -> B -> A 
5

私はProgramming in Scalaのこの章では、形質線形化プロセスの理解を助けることができることを、信じている:

Programming in Scala - 12.6 Why not multiple inheritance?

+0

だから、ここ同じ変数であるように見えるものを、タイプのその変数をシャドウイングによって線形され、相続命令の左端を配置しました右に位置するものは1つですか? – noncom

関連する問題