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プライベートにすると、サブクラスはセッターを使用せずに設定できなくなります。

于 2012-12-04T11:33:49.783 に答える
1

Scalaでは、クラス本体全体がプライマリコンストラクターを構成します。したがって、コンストラクターの最初の部分としてセッターを呼び出すことができます。しかし、構文はかなり厄介だと思います。あなたはこのようなことをすることができます:

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オブジェクトを作成するだけです。これを実現する方法はたくさんありますが(レンズを検索)、簡単な方法はで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 に答える