Python中继承:如何在 scala中继承类(scala inheritance)

关于Python中继承的问题,在scala inheritance中经常遇到, 我试图在 Scala 中继承一个类。我的父类是

我试图在 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不能从普通类继承?

2

您不能从一个 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)

但是,对于您的信息,在这种情况下使用traits 也很常见,这允许更大的灵活性(traits 支持多重继承)和略少的详细语法,如下所示:

trait Person {
  def name: String
  def age: Int
  def valid: Boolean
}
case class MarriedPerson(
  name: String,
  age: Int,
  valid: Boolean,
  spouse: Person) extends Person

如果您对为什么可以在traits 中定义defs 被子类中的vals 覆盖感到好奇,这是因为 Scala 实现了Uniform Access Principle

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(221)
Pc蓝牙适配器:“适配器”还是“适配器”(adaptor or adapter)
上一篇
Python进阶:如何用 c#语言做一个棒球跑者进阶的代码(需要帮助)
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(69条)