scala - 如何废弃 scala 类构造的样板?

标签 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
}

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

有没有办法在编译时自动生成这个样板?

谢谢。

最佳答案

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

在您的特征中,通过调用 protected 方法来实现 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

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

关于scala - 如何废弃 scala 类构造的样板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42172907/

相关文章:

python - 显式相对导入的正确样板是什么?

angularjs - ngBoilerplate+bootstrap -> 导航栏未显示正确

scala - Akka 通过负载均衡器询问

c++ - 初始化构造函数 C++

javascript - 使用参数数组调用 JavaScript 构造函数

c++ - 我应该在 C++ 中使用构造函数还是初始化函数

scala - 从字符串到数字类型的快速安全转换

python - 在开发 Spark 应用程序时使用多种语言

scala - Scala流的功能处理而不会出现OutOfMemory错误

c++ - 如何用宏替换 "template <typename ..."?