在Scala中,我们可以覆盖字段。我想知道这有什么好处? 通常我们只是继承该字段并在子类的构造函数中设置其值。 有人能举例吗?
答案 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()
}