2017-02-23 1 views
2

私はscalaがどのようにダイヤモンドの継承状況に対処するのかを理解しました。私はフィールドで同じ問題がどのように解決されているのかが分かりました。ここに私が理解しようとしているもの -Scala Traitsの相反するフィールド

class A {print("A")} 
trait B extends A {print("B") ; val x="b"} 
trait C extends B {print("C")} 
trait D extends A {print("D"); val x="d"} 

object TraitsEx extends App { 
    var d = new A with B with D 
    println(d.x) 
} 

上記のコードはコンパイルされません。

+0

エラーメッセージにはどのように修正する必要がありますか? –

+1

ここでもコンパイルエラーを貼り付けることができますか? – WarFox

答えて

2

ご覧のとおり、魔法のようにうまくいきません。これはAクラスのプロパティだった場合、あなたはそれをオーバーライドすることができます - クラスの線形化で、あなたはすでに知っている、X extends Aは値オーバーライドします各with X、:

trait A { 
    val x = "a" 
} 

trait B extends A { 
    override val x = "b" 
} 

trait C extends A { 
    override val x = "c" 
} 

object Main { 
    def main(args: Array[String]): Unit = { 
    println((new A {}).x) 
    println((new A with B).x) 
    println((new A with B with C).x) 
    } 
} 

プリントしかし

a 
b 
c 

、コンパイラが他のxをオーバーライドすることが証明できない独自のxを各クラスが導入すると、その問題が解決されます。あなたはすべての異なるx Sをオーバーライドして、曖昧さを取り除くでしょう

object TraitsEx extends App { 
    var d = new A with B with D { override val x = "d" } 
    println(d.x) 
} 

この方法:それも一つの解決策を提案します。

+0

私の答えを見てみてください! – MotaF

2

スカラは、を解決することによって競合するフィールドを解決します。

Error:(21, 16) <$anon: A$A123.this.A with A$A123.this.B with A$A123.this.D> inherits conflicting members: 
    value x in trait B of type String and 
    value x in trait D of type String 
(Note: this can be resolved by declaring an override in <$anon: A$A123.this.A with A$A123.this.B with A$A123.this.D>.) 
    var d = new A with B with D 
      ^

1つのフィールドが他のフィールドを上書きすることになっている場合は、コードにそのフィールドを入れる必要があります。指定されたオーバーライドがなければ、コンパイラはあなたの意思決定を行いません。

関連する問題