构造函数参数的约束

时间:2012-11-23 17:58:52

标签: scala parameters constraints

对不起,但我是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?

的字段

1 个答案:

答案 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