如何将Scala的var标记为部分覆写父类成员?
Scala中用Var覆写父类只读成员的语法问题
先看这个简单的Trait定义:
trait Parent { def x: Int = 0 }
现在想实现一个子类,把x定义为可变的var:
class Child extends Parent { var x: Int = 1 }
这段代码无法编译,会抛出以下错误:
7 | var x: Int = 1 | ^ | error overriding method x in trait Parent of type => Int; | variable x of type Int needs `override` modifier
尝试给var加上override修饰符:
override var x: Int = 1
依然编译失败,错误信息变为:
7 | override var x: Int = 1 | ^ | setter x_= overrides nothing
这是合理的:Scala中的var会自动生成两个方法——只读的x(getter)和可写的x_=(setter)。其中getter方法需要覆写父类的x,但父类并没有定义x_=方法,所以setter部分找不到可覆写的成员,导致报错。
当然可以通过私有变量加显式实现getter/setter的方式解决:
class Child extends Parent { private var _x: Int = 1 override def x: Int = _x def x_=(value: Int): Unit = { _x = value } }
但这种写法需要写大量样板代码,完全不符合Scala追求简洁的风格。那有没有办法直接用var x,只让它的getter部分覆写父类成员,而setter部分作为新成员定义呢?
内容的提问来源于stack exchange,提问作者Silvio Mayolo
相关产品推荐
相关产品推荐

