如何废弃 scala class 构造的样板文件?
How to scrap boilerplate for scala class construction?
我有一个基本特征
trait MyClass{
def items: List[MyClass]
def op(c: MyClass): MyClass
}
和几个具体的子类型。
我希望每个子类型都从父特征中实现此方法op
,但实现中的唯一区别是class它们正在构建。
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
}
这感觉很多余,我觉得应该有更好的方法。我看过一些类似的情况,似乎人们求助于运行时反射来找到正确的构造函数。
有没有办法在编译时自动生成这个样板文件?
谢谢。
使用模板方法设计模式: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() 以便 returns 正确的对象:
override def createObject(inItems: List[MyClass]) = new Class1(inItems)
当然会根据需要替换 Class1
。
它不是完全自动生成的,但重复较少。
我有一个基本特征
trait MyClass{
def items: List[MyClass]
def op(c: MyClass): MyClass
}
和几个具体的子类型。
我希望每个子类型都从父特征中实现此方法op
,但实现中的唯一区别是class它们正在构建。
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
}
这感觉很多余,我觉得应该有更好的方法。我看过一些类似的情况,似乎人们求助于运行时反射来找到正确的构造函数。
有没有办法在编译时自动生成这个样板文件?
谢谢。
使用模板方法设计模式: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() 以便 returns 正确的对象:
override def createObject(inItems: List[MyClass]) = new Class1(inItems)
当然会根据需要替换 Class1
。
它不是完全自动生成的,但重复较少。