首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何丢弃用于scala类构造的样板?

如何丢弃用于scala类构造的样板?
EN

Stack Overflow用户
提问于 2017-02-11 14:12:38
回答 1查看 77关注 0票数 2

我有一个基本的特点

代码语言:javascript
运行
复制
trait MyClass{

    def items: List[MyClass]

    def op(c: MyClass): MyClass
}

和几个具体的子类型。

我希望每个子类型都从父特征实现这个方法op,但实现中唯一的区别是它们构造的是哪个类。

代码语言:javascript
运行
复制
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
}

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

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

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-11 19:52:42

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

在您的特征中,使用对受保护方法的调用来实现op()。

代码语言:javascript
运行
复制
 def op(c: MyClass): MyClass = createObject(items.map{_.op(c)})
 protected def createObject(inItems: List[MyClass]): MyClass

然后,在子类型中,实现createObject(),以便它返回正确的对象:

代码语言:javascript
运行
复制
override def createObject(inItems: List[MyClass]) = new Class1(inItems)

当然,根据需要替换Class1

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42172907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档