覆盖类中的类

时间:2016-12-01 13:06:06

标签: scala

鉴于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

还有其他想法吗?

更新: 修复了响应中提到的编译错误

2 个答案:

答案 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
]);