我试图在Scala中继承一个类。我的父类是
case class Person (name:String, age:Int, valid:Boolean)
我的孩子班是
case class MarriedPerson (override val name: String,
override val age: Int,
override val valid: Boolean,
spouse: Person) extends Person(name, age, valid)
当我尝试这个时,我收到错误说
:13:错误:案例类MarriedPerson具有案例祖先Person,但禁止个案继承。要克服此限制,请使用提取器在非叶节点上进行模式匹配。
case class
继承另一个case class
?如果我删除父类中的“case”,我会收到错误消息 该
:15:错误:值名称不会覆盖任何内容 override val name:String,
为什么case class
在这种情况下不能从普通类继承?
答案 0 :(得分:1)
您无法从一个案例类继承到另一个案例类。从理论上讲,它可以从一个案例类继承到一个非案例类,但不建议这样做(这就是为什么让你的案例类最终成为一个好习惯 - 更多关于this post中的主题)。
除了其他特性之外,案例类还公开了所有构造函数参数。普通类不会发生这种情况,这就是为什么要让你的代码片段工作,你应该在Person
的所有val
的参数前加上。{/ p>
因此,以下是有效的语法:
class Person(val name: String, val age: Int, val valid: Boolean)
case class MarriedPerson(
override val name: String,
override val age: Int,
override val valid: Boolean,
spouse: Person) extends Person(name, age, valid)
但是,对于您的信息,在这种情况下使用trait
也很常见,这允许更大的灵活性(trait
支持多重继承)和稍微冗长的语法,如下:
trait Person {
def name: String
def age: Int
def valid: Boolean
}
case class MarriedPerson(
name: String,
age: Int,
valid: Boolean,
spouse: Person) extends Person
如果您对为什么可以在def
中定义trait
在子类中被val
覆盖的原因感到好奇,那是因为Scala实现了Uniform Access Principle }。