对不起,但我是Scala的新手。 我有一个抽象类和一个从抽象类继承并实现其字段的具体类。
abstract class Element {
var name: String
var description: String
}
class ConcreteElement (var name: String, var description: String)extends Element
这是对的吗?是? 我有很多继承自抽象类Element的类。 现在我想检查一下变量名,我只想根据某些约束来实例化名称。我在哪里放这个控件?显然在抽象类Element中。
在Scala中变量声明var x:T等效于getter函数x和setter函数x_ =的声明,定义如下:
def x: T
def x_= (y: T): Unit
所以我决定以这种方式声明变量,并在getter方法名称中建立我的约束。
abstract class Element {
def name: String
def name_= (y: String): Unit = {CONSTRAINT}
var description: String
}
class ConcreteElement(var name:String,var description:String)extends Element
这个推理是正确的吗? ConcreteElement实际上实现了Element?
的字段答案 0 :(得分:1)
只有在未被子类覆盖的情况下,def name_=
才有效。所以我猜你需要final
来阻止它被覆盖。
abstract class Element {
protected var _name: String
final def name: String = _name
final def name_= (value: String) {
if (isBadValue(value)) throw new IllegalArgumentException
_name = value
}
var description: String
}
class ConcreteElement (protected var _name: String, var description: String) extends Element