2017-02-15 89 views
0

使用Google的一定量後,我寫了這個代碼繼承從抽象類的情況下,不類代碼重複

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和酒吧之間重複的代碼。所有的字段都在Foo和Bar之間重複,然後在擴展時必須通過Foo的所有字段。

我不知道是否有一個簡潔的方式來編寫上面的代碼。

+0

「Foo和Bar之間的代碼重複如此之多」 - 您的意思是在'Foo'中聲明一個字段?我認爲這有點誇張。 –

+0

我不得不重新定義Bar中Foo的每個字段(儘管Bar是Foo的孩子),然後我必須在擴展時將每個字段傳遞給Foo。現在這裏可能看起來不多......但在現實生活中,我的Foo有8個字段,代碼看起來非常難看。 –

回答

2

可以減少重複的量,如果你讓name正常領域Foo,而不是一個構造函數參數:

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"})