覆盖子类中的字段

时间:2012-08-04 10:57:54

标签: scala

在Scala中,我们可以覆盖字段。我想知道这有什么好处? 通常我们只是继承该字段并在子类的构造函数中设置其值。 有人能举例吗?

1 个答案:

答案 0 :(得分:8)

前奏:

Scala不允许覆盖var,因为它们必须被共同覆盖(字段读取)以及不相容(字段写入),这意味着它们必须实际上是不变的。 Scala确实允许您共同覆盖val,因为它们只能被读取(一旦它们被初始化)。

示例:

这里有两个用例,都说明了一个专业化。假设以下最小类层次结构:

class A
class B extends A

示例1: 在下面的示例中,我们使用字段重写来专门化子类。也就是说,在使用Super实例时,我们所知道的是super.f包含A类型的对象。但是,在使用Sub实例时,我们知道sub.f包含B类型的专用对象。

class Super {
  val f: A = new A()
}

class Sub extends Super {
  override val f: B = new B()
}

示例2: 字段覆盖的不同用例是使用字段覆盖方法。这种可能性允许我们以一般方式指定接口,也就是说,我们让潜在的实现者可以选择在每次调用时计算f的值,而且,只计算f一次(在此期间)实例化)。在后一种情况下,f是常量,这允许编译器执行更积极的优化。

trait Interface {
  def f: A = new A()
}

class Impl extends Interface {
  override val f: A = new A()
}