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.

我注意到的另一件事是,如果我删除extends super.Statein SimpleGridWorld,一切正常(我不明白为什么,我确实需要GridWorld.State这里定义的功能)。有什么解释吗?谢谢!

更新 无论如何我看到我的设计模式很奇怪,因为如果StateinSimpleGridWorld不继承GridWorld.this.Statedynamics将引用根特征中定义的未实现的模式World(这是有道理的,因为实现 inGridWorld可能使用GridWorld.this.State其中可能不存在的功能SimpleGridWorld.this.State)。但我想要的是:

  1. XXXWorld.this.State必须继承它super.State(或只是使用它)
  2. dynamics除非在此处被覆盖,否则总是指super.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 回答