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)
)将享受同样的好处。它们没有“大脑使人类有能力参与关于语义的毫无意义的争论”。你会说,这种说法也“相当误导”,因为老鼠有大脑,但不争论语义吗