对继承内部类scala的重载定义的模糊引用

时间:2012-12-13 17:52:59

标签: scala inheritance overloading inner-classes ambiguous-call

所以这是有问题的代码:

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
}

编译器说,dynamicsWorld中的GridWorld与签名匹配。但是,在World中,它是抽象的,然后在GridWorld中实现,因此在我看来很清楚我正在调用GridWorld.this.dynamics

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

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

  1. SimpleGridWorld.this.State必须继承其XXXWorld.this.State(或只是使用它)
  2. super.State如果在超级特质/类中实现,则始终引用dynamics,除非在此处覆盖。
  3. 我该怎么做?我认为这不是一个完全不相关的问题,可能前一个问题的答案会告诉我如何重新设计我的模式。

1 个答案:

答案 0 :(得分: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
}