在案例类中继承属性

时间:2017-06-05 00:00:40

标签: scala

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

让我们说一个具有一些属性的案例类

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

另外两个案例类(case class A & case class B)将具有上述参数以及一些额外字段。我试图避免代码重复,并想知道什么是最好的策略。

找到一个讨论相同Scala case class inheritance的线程但不确定组合/继承是否是最合适的选项。

1 个答案:

答案 0 :(得分:3)

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

包含共享成员的父级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中进行了描述。

注意:scala中禁止case-to-case继承。

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)