5

私はこの具体的なクラスを持っています:

class Person (var name: String, var surname: String)

そして、Person を拡張する別のクラスを作成したいと思います。

class Son (name: String, surname: String) extends Person(name, surname)

わかった。しかし、Son のコンストラクターのフィールドは、val ではなく var でなければなりません。これを修正するにはどうすればよいですか? フィールドは、コンストラクター パラメーターのままにする必要があります。

更新 #2

私の問題は次のとおりです。Son でメソッドを定義する場合、値を Son のインスタンスのパラメーターに変更すると機能しません。

class Son (name: String, surname: String) extends Person(name, surname){
  def printSon = {
  if(this.name=="name")println("Error name Person")
  if(this.surname=="surname")println("Error surname Person")
  }
}

object main {
  def main(args: Array[String]): Unit = {}

  val Marco = new Son("Marco","Bianchi")
  Marco.printSon // So far everything is ok
  Marco.name="name"
  Marco.printSon // Here in control is not done, because Marco.name="name" writes in Person
  println("FINE")
}

Son の name e surname は val 型です。

4

2 に答える 2

14

私の理解が正しければ、VAR である Person のフィールドとは対照的に、フィールドnamesurnameフィールドを不変にする必要があります。Son

それは単に不可能です。それを行う唯一の方法は、上書きすることです:

class Person (var name: String, var surname: String)

//this won't compile
class Son(override val name: String, override val surname: String) extends Person(name, surname)

Scala では、var を val で上書きすることはできません。その理由は明らかです。サブクラスは、スーパークラスをオーバーライドしたり、機能を追加したりすることしかできません。vals が vars をオーバーライドできるようにする場合は、オーバーライドされたフィールドのセッターを親クラスから削除します。これにより、継承によって暗示された「is-a」関係が壊れます。

あなたができることは、これを次のように実装することです:

trait Person {
    def name: String
    def surname: String
}

//this is fine now
class Son(val name: String, val surname: String) extends Person

//in case you want a type of person which can be changed.
class MutablePerson(var name: String, var surname: String) extends Person

Personnamenow は trait です - orを取得する方法を提供するだけsurnameです。Sonvals を使用してオーバーライドPersonします。したがって、誰もフィールドを二度と変更しないという保証が得られますSon

Personあなたの例から、変更可能なタイプをまだ持ちたいと思います。上記のクラスを使用してそれを行うことができますMutablePerson。これにより、フィールドを変更できます。

お役に立てれば !

于 2012-11-30T15:18:06.340 に答える
6

paramsには別の名前を付ける必要があります。そうしないと、sonの本体のメソッドが、Personクラスのフィールドではなくparamsにアクセスしようとするためです。本体でパラメータにアクセスすると、Scalaはパラメータのフィールドを自動的に作成します。これは、次のようなことを行うと機能します(これも一般的に使用されるパターンです)。

class Son (_name: String, _surname: String) extends Person(_name, _surname){
  def printSon = {
  if(name == "name")println("Error name Person")
  if(surname == "surname")println("Error surname Person")
  }
}
于 2012-11-30T15:28:21.870 に答える