2017-02-11 57 views
2

我有一個基礎特徵如何爲scala課堂建造廢料樣板文件?

trait MyClass{ 

    def items: List[MyClass] 

    def op(c: MyClass): MyClass 
} 

和幾個具體的子類型。

我希望每個子類型都從父特徵實現此方法op,但實現中的唯一區別是它們正在構造哪個類。

class Class1(override val items: List[MyClass]) extends MyClass = { 
    def op(c: MyClass): MyClass = new Class1(items.map{_.op(c)}) 

    //other stuff 
} 

class Class2(override val items: List[MyClass]) extends MyClass = { 
    def op(c: MyClass): MyClass = new Class2(items.map{_.op(c)}) 

    //other stuff 
} 

class Class3(override val items: List[MyClass]) extends MyClass = { 
    def op(c: MyClass): MyClass = new Class3(items.map{_.op(c)}) 

    //other stuff 
} 

這感覺非常多餘,我覺得好像應該有更好的辦法。我看過一些類似的情況,似乎人們訴諸運行時反射來找到正確的構造函數。

有沒有辦法在編譯時自動生成這個樣板文件?

謝謝。

回答

2

使用模板方法設計模式:https://www.tutorialspoint.com/design_pattern/template_pattern.htm

在你的特點,實現OP()與受保護的方法的調用。

def op(c: MyClass): MyClass = createObject(items.map{_.op(c)}) 
protected def createObject(inItems: List[MyClass]): MyClass 

然後,在亞型,實施的CreateObject(),以便它返回正確的對象:

override def createObject(inItems: List[MyClass]) = new Class1(inItems) 

更換Class1根據需要,當然。

它不是完全自動生成的,但重複性較低。