如何不覆盖父类的val?

时间:2016-06-19 15:23:21

标签: 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 name needs `override' modifier
       case class Student(id: Int, name: String) extends Person(name)
                                   ^

这可能是一个微不足道的问题,但在搜索网页很长一段时间后,我无法弄清楚如何简单地传递Student的构造函数将被提供为{{1}的字符串到name的构造函数。我不想覆盖任何东西。我做错了什么?

非常感谢你!

1 个答案:

答案 0 :(得分:2)

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

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

或者,如果有一个实际的原因,为什么你不想覆盖name(我无法想象可能是什么,但如果...),那么Student不应该是案例类:class Student(val id: Int, name: String) extends Person(name)