2017-06-05 107 views
2

从案例分类继承某些属性的最佳方式是什么?在案例分类中继承属性

比方说,有一些特性

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

其他两个case类(case class A & case class B)的情况下,类将有上述参数加上一些额外的字段。我试图避免代码重复,并想知道什么是最好的策略。

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

回答

3

1)我倾向于限定trait当性质阶是共享的,虽然我在Java限定interface然后abstract class。与共享成员m1

父类,m2

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) 
+0

感谢。在这里,我们基本上重新定义了子类中的那些参数,这是我试图避免的,因为它是代码重复。有没有办法为每个孩子类别再次定义m1,m2。我知道这是可能的组成。 –

+0

同意,您也必须重写子类中的这些属性,这意味着将使用此方法重复代码。但是这个想法是所有的孩子都会遵守合同。 – prayagupd

+0

是的,谢谢澄清。刚刚学到了一些新的东西:) –