所以这是有问题的代码:
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.State
in SimpleGridWorld
,一切正常(我不明白为什么,我确实需要GridWorld.State
这里定义的功能)。有什么解释吗?谢谢!
更新
无论如何我看到我的设计模式很奇怪,因为如果State
inSimpleGridWorld
不继承GridWorld.this.State
,dynamics
将引用根特征中定义的未实现的模式World
(这是有道理的,因为实现 inGridWorld
可能使用GridWorld.this.State
其中可能不存在的功能SimpleGridWorld.this.State
)。但我想要的是:
XXXWorld.this.State
必须继承它super.State
(或只是使用它)dynamics
除非在此处被覆盖,否则总是指super.dynamics
是否在超级特征/类中实现。
我怎样才能做到这一点?我认为这不是一个完全不相关的问题,可能前一个问题的答案会告诉我如何重新设计我的模式。