2017-02-11 34 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根据需要,当然。

它不是完全自动生成的,但重复性较低。