4

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

4

1 回答 1

9

序幕:

Scala 不允许您覆盖vars,因为它们必须被协变(字段读取)和逆变(字段写入)覆盖,这意味着它们实际上必须是不变的。Scala 确实允许您以val协变方式覆盖 s,因为它们只能被读取(一旦它们被初始化)。

例子:

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

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()
}
于 2012-08-04T12:24:08.263 回答