scala - 在案例类之间继承属性

标签 scala inheritance case-class

从案例类继承某些属性的最佳方法是什么?

假设有一个具有某些属性的案例类

case class aggregations (aggregation1: Int, aggregation2: Int)

另外两个案例类 (案例类 A 和案例类 B) 将具有上述参数以及一些额外的字段。我正在努力避免代码重复并想知道什么是最佳策略。

找到一个讨论相同的话题 Scala case class inheritance但不确定组合/继承是否是这里最合适的选择。

最佳答案

1) 当在 scala 中共享属性时,我倾向于定义 trait,尽管我会定义 interface 然后是 abstract class 在 java 中。

具有共享成员的父类 m1m2

scala> trait Parent { def m1: Int, def m2: Int}

有自己成员的子类

scala> case class Child1(val m1: Int, val m2: Int, val m3: Int) extends Parent
defined class Child1

scala> case class Child2(val m1: Int, val m2: Int, val m4: String) extends Parent
defined class Child2

使用子类

scala> Child1(1, 2, 3) == Child1(1, 2, 3)
res2: Boolean = true

scala> Child2(1, 2, "urayagppd") == Child2(1, 2, "prayagupd")
res4: Boolean = false

帖子中也有描述you mentioned .

注意:case-to-case继承在 scala 中是被禁止的。

scala> case class A(m1: Int)
defined class A

scala> case class B(m1: Int, m2: Int) extends A(m1)
<console>:13: error: case class B has case ancestor A, but case-to-case inheritance is prohibited. To overcome this limitation, use extractors to pattern match on non-leaf nodes.
       case class B(m1: Int, m2: Int) extends A(m1)

2) 如果您不喜欢在子类中显式覆盖父属性,请使用组合。

父类

scala> trait Parent
defined trait Parent

scala> case class ParentClass(val m1: Int, val m2: Int) extends Parent
defined class ParentClass

子类

scala> case class Child1(parent: ParentClass, val newMember: Int) extends Parent
defined class Child1

scala> Child1(ParentClass(100, 200), 400)
res0: Child1 = Child1(ParentClass(100,200),400)

scala> case class Child2(parent: ParentClass, val newMember2: String) extends Parent
defined class Child2

scala> Child2(ParentClass(100, 200), "inheritence sucks")
res2: Child2 = Child2(ParentClass(100,200),inheritence sucks)

关于scala - 在案例类之间继承属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44360001/

相关文章:

javascript - 继承angularJS模块

c# - 如何反射(reflect)用于继承的泛型参数

scala - 用于向 Scala Actors 发送消息的符号或案例类?

scala - 是否可以创建一个字段依赖于另一个字段的案例类?

java - 如何使用 RowMatrix.columnSimilarities 的输出

scala - Scala缓存是否转换为功能接口(interface)

scala - 在 Sbt 中包含 Spark 包

scala - Scala 中重写和继承的辅助构造函数

java - 我基于套接字的 EchoServer 和 EchoClient 有什么问题?

scala - Scala 中的模式匹配与案例类