经过一些谷歌搜索,我写了这段代码
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的所有字段。
我想知道是否有一种简洁的方式来编写上面的代码。
答案 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)
您可以使用宏来在编译时生成相应的代码,但是除此之外您无能为力。