我试图在 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:错误:case 类 MarriedPerson 具有 case 祖先 Person,但禁止大小写继承。要克服此限制,请使用提取器在非叶节点上进行模式匹配。
为什么会这样,我如何解决这个问题来获得一个case class
继承另一个case class
?
如果我删除父类中的“案例”,我得到一个错误说
:15:错误:值名称不覆盖任何内容覆盖 val 名称:String,
在这种情况下,为什么case class
不能从普通类继承?
您不能从一个 case 类继承到另一个 case 类。理论上可以从 case 类继承到非 case 类,但不建议这样做(这就是为什么使您的 case 类最终成为一个好习惯的原因-更多关于this post中的主题)。
除其他特性外,Case 类还具有公开公开所有构造函数参数的特性。普通类不会发生这种情况,这就是为什么要使代码片段正常工作的原因,您应该在所有Person
的参数前面加上val
。
因此,以下是有效的语法:
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
s 也很常见,这允许更大的灵活性(trait
s 支持多重继承)和略少的详细语法,如下所示:
trait Person {
def name: String
def age: Int
def valid: Boolean
}
case class MarriedPerson(
name: String,
age: Int,
valid: Boolean,
spouse: Person) extends Person
如果您对为什么可以在trait
s 中定义def
s 被子类中的val
s 覆盖感到好奇,这是因为 Scala 实现了Uniform Access Principle。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(69条)