Scala 如何不重写父类的val?

Scala 如何不重写父类的val?,scala,inheritance,Scala,Inheritance,请查看以下代码: 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 nam

请查看以下代码:

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)
                                   ^
scala>密封抽象类Person(val名称:String)
限定类人
scala>case类Student(id:Int,name:String)扩展Person(name)
:8:错误:重写字符串类型的类Person中的值名称;
值名称需要“重写”修饰符
案例类学生(id:Int,name:String)扩展Person(name)
^
这可能是一个无关紧要的问题,但在搜索web相当长的一段时间后,我无法想出如何简单地将
学生
的构造函数作为
名称
提供给
的构造函数的字符串传递给
人。我不想推翻任何东西。我做错了什么


提前非常感谢

一个case类的所有构造函数参数都是
val
s。这就是重点。粗略地说,它使您能够享受cases类与常规类相比所提供的好处:复制、提取、模式匹配等

如果希望
Student
成为案例类,则应重写
name
。从理论上讲,您可以通过给val一个不同的名称来避免重写它:
案例类Student(id:Int,studentName:String)扩展Person(studentName)
-这是可行的,但没有多大意义-您最终拥有两个不同的成员val,它们的值总是相同的


或者,如果您不想覆盖
name
(我无法想象这可能是什么,但如果…),那么
Student
不应该是case类:
classstudent(val-id:Int,name:String)扩展Person(name)

一个case类的所有构造函数参数都是
val
s。这就是重点。粗略地说,它使您能够享受cases类与常规类相比所提供的好处:复制、提取、模式匹配等

如果希望
Student
成为案例类,则应重写
name
。从理论上讲,您可以通过给val一个不同的名称来避免重写它:
案例类Student(id:Int,studentName:String)扩展Person(studentName)
-这是可行的,但没有多大意义-您最终拥有两个不同的成员val,它们的值总是相同的


或者,如果您不想覆盖
name
(我无法想象可能是什么,但是如果…),那么
Student
不应该是一个case类:
classstudent(val-id:Int,name:String)扩展Person(name)

也许您想要:
Person{def name:String}
取而代之。也许你打算:
密封的trait Person{def name:String}
取而代之。第一段很容易让人误解。如果它是正确的,非
case
类的构造函数参数是
val
s(例如
类学生(val-id:Int,val-name:String)
)“大脑使人类有能力参与关于语义的毫无意义的争论”。你会说,这种说法“相当误导”同样,因为老鼠有大脑,但不争论语义?:)第一段是相当误导的。如果它是正确的,那么构造函数参数为
val
s的非
case
类(例如
class-Student(val-id:Int,val-name:String)
)将享受同样的好处。它们没有“大脑使人类有能力参与关于语义的毫无意义的争论”。你会说,这种说法也“相当误导”,因为老鼠有大脑,但不争论语义吗