如何为scala类构造废弃样板文件?

时间:2017-02-11 06:12:38

标签: scala constructor boilerplate

我有一个基本特征

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
}

这感觉非常多余,我觉得应该有更好的方法。我看了一些类似的情况,似乎人们求助于运行时反射来找到正确的构造函数。

无论如何都要在编译时自动生成这个样板文件吗?

感谢。

1 个答案:

答案 0 :(得分: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

它不是完全自动生成的,但重复次数较少。