2016-06-19 7 views
0

次のコードを見てみてください。親クラスのvalをオーバーライドしない方法は?

scala> sealed abstract class Person(val name: String) 
defined class Person 

scala> case class Student(id: Int, name: String) extends Person(name) 
<console>:8: error: overriding value name in class Person of type String; 
value name needs `override' modifier 
     case class Student(id: Int, name: String) extends Person(name) 
           ^

これは些細な質問かもしれませんが、かなりの時間のためのWebを検索した後、私は単純にその文字列を渡す方法を見つけ出すことができませんでしたStudentのコンストラクタはnameとしてPersonのコンストラクタに提供されます。私は何かを無効にしたくない。私は間違って何をしていますか?

ありがとうございます!

+2

おそらく、あなたは 'sealed trait Person {def name:String}'を意図しています。 –

答えて

2

ケースクラスのすべてのコンストラクタパラメータは、valです。それは全体のポイントです。あなたはStudentはケースクラスになりたい場合は、コピー、抽出、パターンマッチングなど

、あなたオーバーライドしてください:大まかに言えば、それは通常のクラスに比べて、あなたのクラスが提供するメリットの例を楽しむ能力を与えるものですname。理論的には、valに別の名前を与えることでそれを上書きしないようにすることができます:case class Student(id: Int, studentName: String) extends Person(studentName) - これはうまくいきますが、あまり意味をなさない - 値が常に同じ2つの異なるメンバーvalを持つことになります。あなたがnameを上書きしたくない理由は、実際の理由がある場合

また、(私は1つが、おそらく何ができるか想像できませんが、...場合)、Studentはケースクラスであってはなりません:class Student(val id: Int, name: String) extends Person(name)

+0

最初の段落はかなり誤解を招く。もしそれが正しければ、コンストラクタパラメータが 'val'sである' caseクラス '(例えば' class Student(val id:Int、val name:String) ')でも同じ利点を得るでしょう。彼らはしません。 –

+0

@AlexeyRomanov「脳は、人間が意味論について無意味な議論に従事する能力を与えるものです。ラットには脳がありますが、セマンティクスは主張しないので、この声明は「かなり誤解を招く」ものであると主張しますか? :) – Dima

関連する問題