したがって、問題のあるコードは次のとおりです。
trait World {
type State
def dynamics(s: State): State
// ...
}
trait GridWorld extends World {
class State {...} // concrete
def dynamics(s: State) = s // concrete
// some other staff still abstract
}
trait SimpleGridWorld extends GridWorld {
class State extends super.State {...} // concrete
def foo {dynamics(new State)} // compiler error
}
コンパイラは、dynamicsと の両方で、署名Worldに一致すると言います。GridWorldただし、 inWorldは抽象的であり、 で実装されGridWorldているため、 を呼び出していることは明らかなように思えますGridWorld.this.dynamics。
私が気付いたもう 1 つのことは、 in を削除するextends super.StateとSimpleGridWorld、すべてが正常に機能することです (理由がわかりませんGridWorld.State。ここで定義されている機能が必要です)。説明はありますか?ありがとう!
更新Stateとにかく、 inが継承しSimpleGridWorldない場合、ルートトレイトで定義された未実装のものを参照するため
、デザインパターンが非常に奇妙に見えます( in の実装は に存在しない可能性のある機能を使用する可能性があるため、これは理にかなっています)。しかし、私が欲しいのは:GridWorld.this.StatedynamicsWorldGridWorldGridWorld.this.StateSimpleGridWorld.this.State
XXXWorld.this.Stateそれを継承する必要がありますsuper.State(または単に使用する必要があります)dynamicssuper.dynamicsここでオーバーライドされない限り、スーパー トレイト/クラスで実装されている場合は常に を参照します。
これどうやってするの?それはまったく無関係な質問ではないと思います。おそらく、前の質問への答えは、パターンを再設計する方法を教えてくれるでしょう.