如何在scala中继承类

时间:2017-07-17 06:15:08

标签: scala inheritance

我试图在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,但禁止个案继承。要克服此限制,请使用提取器在非叶节点上进行模式匹配。

  1. 为什么会出现这种情况以及如何解决这个问题,让case class继承另一个case class
  2. 如果我删除父类中的“case”,我会收到错误消息 该

      

    :15:错误:值名称不会覆盖任何内容      override val name:String,

  3. 为什么case class在这种情况下不能从普通类继承?

1 个答案:

答案 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 }。