1

给我一些帮助,我就是无法解决这个问题。如何确保始终遵守对 getter 方法的约束?我的课程有这种形式:

abstract class Element {
  var name: String
  var description: String
}

class Component (var name: String, var description: String) extends Element

出于我项目的目的,我需要使用 var。name我想对必须始终尊重的领域施加限制。当我创建Component如下实例时:

val C1 = new Component ("C1 Component", "Description of C1")

当我更改值时:

C1.name = "new value"

如果我以这种方式创建类:

abstract class Element {
  protected var _name : String
  // Getter
  final def name = _name
  // Setter
  final def name_= (value:String):Unit =
    if (value.size < 5) println ("ERROR: Bad Value")
    else _name = value

  var description: String
}

class Component (protected var _name : String, var description: String) extends Element

在 main 方法中,因为我这里没有控制权:

val C1 = new Component ("C1", "Description of C1")

但只有稍后,当我更改值时:

C1.name = "comp"

我希望我的吸气剂永远受到尊重。我该怎么做呢?

4

2 回答 2

2
class Component (_name : String, var description: String) extends Element {
  this.name = _name
}

另外,var _name设为私有,因此子类在不使用 setter 的情况下无法设置它。

于 2012-12-04T11:33:49.783 回答
1

在 Scala 中,整个类体构成了主要的构造函数。因此,您可以将 setter 称为构造函数的第一部分。然而,在我看来,语法相当混乱。你可以这样做:

abstract class Element {
 var name: String
 var description: String
}

class Component (private var _name :String, var description : String) extends Element {
  name = _name
  def name = _name
  def name_=(value: String) = {
    require(value.size > 5, "Bad value")
    _name = value
  }
}

然而vars以你使用它们的方式可能是……不明智的。使用不可变类并处理此类的副本要好得多。因此,任何时候您需要修改该名称字段...只需创建一个新的 Component 对象,该对象与旧的相同,但名称不同。有很多方法可以实现这一点(搜索 Lenses),但一种简单的方法是copy使用case classes. 这是一个例子:

我们将 Component 类更改为 case 类:

case class Component (private var _name :String, var description : String) extends Element {
  name = _name
  def name = _name
  def name_=(value: String) = {
    require(value.size > 5, "Bad value")
    _name = value
  }
}

我们的用法是这样的:

val C1 = new Component ("Some component name", "Description of C1") 
//Component(Some component name, Description of C1)

val C2 = C1.copy(_name = "Another component name") 
// Component(Another component name ,Description of C1)
于 2012-12-04T11:48:14.660 回答