【问题标题】:How to scrap boilerplate for scala class construction?如何废弃scala类建设的样板?
【发布时间】:2017-02-11 06:12:37
【问题描述】:

我有一个基本特征

trait MyClass{

    def items: List[MyClass]

    def op(c: MyClass): MyClass
}

还有几个具体的子类型。

我希望每个子类型都从父 trait 实现这个方法 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
}

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

有没有在编译时自动生成这个样板文件?

谢谢。

【问题讨论】:

    标签: scala constructor boilerplate


    【解决方案1】:

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

    在你的 trait 中,通过调用受保护的方法来实现 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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多