鉴于Foo
:
class Foo {
def getBar = new Bar
class Bar {
def baz = 3
}
}
我希望能够延长Foo
,并覆盖baz
。
我能想到的最简单的实现是:
class Foo2 extends Foo {
override def getBar = new Bar2
class Bar2 extends Bar {
override def baz = 5
}
}
但我想知道是否有更简单的方法来实现这一目标。
(getBar
可能包含大量代码,而且我不会仅仅通过一小段更改来复制粘贴Bar
- > Bar2
)
我试过了:
class Foo2 {
class Bar extends super.Bar {
override def baz = 5
}
}
但不幸的是,它没有工作
(new Foo2().getBar.baz == 3
)
还有其他想法吗?
更新: 修复了响应中提到的编译错误
答案 0 :(得分:2)
覆盖类需要virtual classes之类的内容。但它们不存在,所以这是不可能的。
我建议不要class Bar extends super.Bar
,因为那时你只是在Bar
隐藏Foo
类,这只会引起混淆。我认为你能做的最好的事情就是在Foo
中提供一个构造Bar
的方法,作为真实构造函数的别名。因为可以覆盖方法,所以构造函数不能。
class Foo {
final def getBar = {
val i: Int = doLotsOfComputations1()
val s: String = doLotsOfComputations2()
initBar(i, s)
}
protected def initBar(i: Int, s: String): Bar = new Bar(i, s)
protected class Bar(i: Int, s: String) {
def baz = 3
}
}
class Foo2 extends Foo {
override protected def initBar(i: Int, s: String) = new Bar2(i, s)
protected class Bar2(i: Int, s: String) extends Bar(i, s) {
override def baz = 5
}
}
答案 1 :(得分:1)
您缺少覆盖
$query = $articles->find('all', [
'conditions' => ['Articles.created >' => new DateTime('-10 days')],
'contain' => ['Authors', 'Comments'],
'limit' => 10
]);