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)
感谢。在这里,我们基本上重新定义了子类中的那些参数,这是我试图避免的,因为它是代码重复。有没有办法为每个孩子类别再次定义m1,m2。我知道这是可能的组成。 –
同意,您也必须重写子类中的这些属性,这意味着将使用此方法重复代码。但是这个想法是所有的孩子都会遵守合同。 – prayagupd
是的,谢谢澄清。刚刚学到了一些新的东西:) –