0

したがって、問題のあるコードは次のとおりです。

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.StateSimpleGridWorld、すべてが正常に機能することです (理由がわかりませんGridWorld.State。ここで定義されている機能が必要です)。説明はありますか?ありがとう!

更新Stateとにかく、 inが継承しSimpleGridWorldない場合、ルートトレイトで定義された未実装のものを参照するため 、デザインパターンが非常に奇妙に見えます( in の実装は に存在しない可能性のある機能を使用する可能性があるため、これは理にかなっています)。しかし、私が欲しいのは:GridWorld.this.StatedynamicsWorldGridWorldGridWorld.this.StateSimpleGridWorld.this.State

  1. XXXWorld.this.Stateそれを継承する必要がありますsuper.State(または単に使用する必要があります)
  2. dynamicssuper.dynamicsここでオーバーライドされない限り、スーパー トレイト/クラスで実装されている場合は常に を参照します。

これどうやってするの?それはまったく無関係な質問ではないと思います。おそらく、前の質問への答えは、パターンを再設計する方法を教えてくれるでしょう.

4

1 に答える 1

1

どうですか:

trait World {
  type State
  def dynamics(s: State): State
}
trait GridWorld extends World {
  type State = MyState
  class MyState {} // concrete
  def dynamics(s: State) = s    // concrete
}
trait SimpleGridWorld extends GridWorld {
  class MyState extends super.MyState {}  // concrete
  def foo {dynamics(new MyState)}  // compiler error; ok
}
于 2012-12-13T19:28:19.930 に答える