所以这是有问题的代码:
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
与签名匹配。但是,在World
中,它是抽象的,然后在GridWorld
中实现,因此在我看来很清楚我正在调用GridWorld.this.dynamics
。
我注意到的另一件事是,如果删除extends super.State
中的SimpleGridWorld
,一切正常(我不明白为什么,我确实需要{{1}中定义的功能} 这里)。有什么解释吗?谢谢!
更新
无论如何,我看到我的设计模式非常奇怪,因为如果GridWorld.State
中的State
不继承SimpleGridWorld
,GridWorld.this.State
将引用根特征dynamics
中定义的未实现的模式。 1}}(这是有道理的,因为World
中的实现可能会使用GridWorld
中可能不存在的GridWorld.this.State
功能。但我想要的是:
SimpleGridWorld.this.State
必须继承其XXXWorld.this.State
(或只是使用它)super.State
如果在超级特质/类中实现,则始终引用dynamics
,除非在此处覆盖。我该怎么做?我认为这不是一个完全不相关的问题,可能前一个问题的答案会告诉我如何重新设计我的模式。
答案 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
}