在 case class 之间继承属性
Inheriting properties among case class
从案例继承某些属性的最佳方法是什么 class?
假设有一个案例 class 具有一些属性
case class aggregations (aggregation1: Int, aggregation2: Int)
另外两种情况 classes (case class A & case class B)
将具有上述参数以及一些额外的字段。我正在努力避免代码重复,想知道什么是最好的策略。
找到一个讨论相同的话题 Scala case class inheritance 但不确定 composition/inheritance 是否是这里最合适的选项。
1) 当在 scala 中共享属性时,我倾向于定义 trait
,尽管我会定义 interface
然后 abstract class
java.
parent class 与共享成员 m1
, m2
scala> trait Parent { def m1: Int, def m2: Int}
child class有自己的成员
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
使用 child classes
scala> Child1(1, 2, 3) == Child1(1, 2, 3)
res2: Boolean = true
scala> Child2(1, 2, "urayagppd") == Child2(1, 2, "prayagupd")
res4: Boolean = false
post中也有描述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) 如果您不喜欢在 child classes 中显式覆盖 parent 属性,请使用组合。
parent class
scala> trait Parent
defined trait Parent
scala> case class ParentClass(val m1: Int, val m2: Int) extends Parent
defined class ParentClass
Child classes
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)
从案例继承某些属性的最佳方法是什么 class?
假设有一个案例 class 具有一些属性
case class aggregations (aggregation1: Int, aggregation2: Int)
另外两种情况 classes (case class A & case class B)
将具有上述参数以及一些额外的字段。我正在努力避免代码重复,想知道什么是最好的策略。
找到一个讨论相同的话题 Scala case class inheritance 但不确定 composition/inheritance 是否是这里最合适的选项。
1) 当在 scala 中共享属性时,我倾向于定义 trait
,尽管我会定义 interface
然后 abstract class
java.
parent class 与共享成员 m1
, m2
scala> trait Parent { def m1: Int, def m2: Int}
child class有自己的成员
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
使用 child classes
scala> Child1(1, 2, 3) == Child1(1, 2, 3)
res2: Boolean = true
scala> Child2(1, 2, "urayagppd") == Child2(1, 2, "prayagupd")
res4: Boolean = false
post中也有描述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) 如果您不喜欢在 child classes 中显式覆盖 parent 属性,请使用组合。
parent class
scala> trait Parent
defined trait Parent
scala> case class ParentClass(val m1: Int, val m2: Int) extends Parent
defined class ParentClass
Child classes
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)