9

私が次の特徴を持っているとしましょう:

trait A

trait B { this: A => }

trait C extends B // { this: A => }

コンパイラエラー:illegal inheritance; self-type C does not conform to B's selftype B with A
予想どおり、自己型アノテーションのコメントを外すと、コンパイラは問題ありません。

Cもこのセルフタイプを必要とする理由は明らかだと思います。コンパイラがすでに必要であると判断できた場合、なぜAから「継承」できないのか理解できません。

複雑な階層を持つセルフタイプを使用する場合、特に、それぞれが独自のセルフタイプを持つ多数の特性を混在させる場合は、冗長性を減らすことができると思います。

私はおそらく現在の振る舞いには正当な理由があると思います、私はそれが何であるかを見つける/理解することができませんでした。

最初は、ミックスインの線形化に関連しているのではないかと思いましたが、ここでは再生されないようです(より複雑な自己タイプとより多くの特性が混在している場合でも)。

場合によってはあいまいさが発生しますか?もしそうなら、あいまいさがないのになぜそれが機能しないのですか?

それとも、それを適切に実装する際のいくつかの困難に関連していますか?

トピックに関するいくつかの議論を見つけることができましたが(自己タイプが継承されていないなど)、ほとんどの場合、問題を述べているだけで、説明や解決策(存在する場合)があまりないので、それがどのようであるかを結論付けています。

4

1 に答える 1

1
trait C extends B with A

唯一の解決策ではありません。あなたも持つことができます

trait AA extends A
trait C extends B with AA

つまり、 のインターフェースを継承するものはすべてA受け入れられます。具体的な実装に依存する必要がある場合は、ミックスインを選択します。実装がユーザー次第である場合、またはトレイトで mixin を指定しない正当な理由がある場合 (たとえば、依存関係の問題を緩和するため)、それを自己型にします。

于 2010-08-06T11:20:21.277 に答える