したがって、問題のあるコードは次のとおりです。
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.State
dynamics
World
GridWorld
GridWorld.this.State
SimpleGridWorld.this.State
XXXWorld.this.State
それを継承する必要がありますsuper.State
(または単に使用する必要があります)dynamics
super.dynamics
ここでオーバーライドされない限り、スーパー トレイト/クラスで実装されている場合は常に を参照します。
これどうやってするの?それはまったく無関係な質問ではないと思います。おそらく、前の質問への答えは、パターンを再設計する方法を教えてくれるでしょう.