19

これは機能しません:

trait Trait
class Class extends Trait with Trait

コンパイラは不平を言います:

<console>:8: error: trait Trait is inherited twice
       class Class extends Trait with Trait
                           ^
<console>:8: error: trait Trait is inherited twice
       class Class extends Trait with Trait
                                      ^

これは次のことを行います。

trait Trait
class Abstraction extends Trait
class Implementation extends Abstraction with Trait

質問:

  • なぜそれが機能するのですか?
  • 2 番目のスニペットはどのように異なりますか? (二重継承の問題について)
  • 2 番目のスニペットまたはパターンは何らかの形で役に立ちますか?
4

1 に答える 1

20

2 番目のスニペットは、特性の線形化のために機能します。コンパイラは、特性を線形リストに編成して、一Trait度だけ表示されるようにします。線形化は

Implementation, Trait, Abstraction, ScalaObject, AnyRef, Any

優れた説明については、Programming Scala のこの章を参照してください。

これは主に、ダイヤモンドの継承の問題に対して一貫したアプローチを行うために行われ、その場合に役立ちます。

Trait線形化後に 2 回出現することはあり得ないため、記述しTrait with Traitても意味がなく、許可されないのは理にかなっています。

于 2011-08-29T13:39:29.307 に答える