2017-02-15 3 views
0

グーグルである程度の量の後、私はこのコードは、コードの重複なしで抽象クラスからケースクラスを継承

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

"FooとBarの間でコードの重複が非常に多い" - あなたはFooで1つのフィールドの宣言を意味しますか?私はこれが少し誇張していると思います。 –

+0

私はBarのFooのすべてのフィールドを再定義しなければなりませんでした(BarはFooの子ですが)。その後、Fooにすべてのフィールドを渡す必要がありました。今ここでそれはあまり見えないかもしれませんが、実際の生活で私のFooは8フィールドを持ち、コードは非常に醜いです。 –

答えて

2

あなたがあなたの代わりに、コンストラクタ引数のFooname通常のフィールドにする場合は、重複の量を減らすことができます。

abstract class Foo { 
    val name: String 
} 

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

コンパイル時に適切なコードを生成するためにマクロでこれを行うことは可能ですが、それ以外の場合はあまりできません。

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"}) 
関連する問題