从抽象类继承case类而不需要代码重复

时间:2017-02-15 21:13:10

标签: scala

经过一些谷歌搜索,我写了这段代码

abstract class Foo(val name: String)
case class Bar(override val name: String, age : Int) extends Foo(name)
def sayHello(f : Foo) = println(f.name)
sayHello(Bar("bar", 10))

但令我困扰的是,Foo和Bar之间存在大量的代码重复。所有字段都在Foo和Bar之间重复,然后我必须在扩展时传递Foo的所有字段。

我想知道是否有一种简洁的方式来编写上面的代码。

3 个答案:

答案 0 :(得分:2)

如果在name中使Foo成为普通字段而不是构造函数参数,则可以减少重复次数:

abstract class Foo {
  val name: String
}

case class Bar(name: String, age: Int) extends Foo

答案 1 :(得分:1)

你可以创建没有成员重复的类/特征依赖,但它使实例化更加冗长,所以我不确定它实际上是否实现了很多代码减少。

trait Foo {val name: String}            // has name
class Bar(val age: Int) {self:Foo => }  // has age

def sayHello(f : Foo) = println(f.name) // unchanged
sayHello(new Bar(10) with Foo{val name = "bob"})

答案 2 :(得分:0)

您可以使用宏来在编译时生成相应的代码,但是除此之外您无能为力。