在 Scala 中,我们可以覆盖字段。我想知道这有什么好处?通常我们只是继承该字段并在子类的构造函数中设置它的值。有人可以举个例子吗?
问问题
1667 次
1 回答
9
序幕:
Scala 不允许您覆盖var
s,因为它们必须被协变(字段读取)和逆变(字段写入)覆盖,这意味着它们实际上必须是不变的。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 回答