摘要案例类的隐式val

时间:2013-06-05 10:13:45

标签: scala

当我在Scala中编写带有案例类的程序时,我遇到了一个反复出现的模式,我希望将一个案例类的创建者作为参数提供给它以供将来参考。我已经了解到我们可以通过将隐含值放入案例类

来捕获此模式
abstract class MessageCreator
case class SomeMessage(s:String)(implicit val creator:MessageCreator)
class MyCreator extends MessageCreator { implicit val creator = this}
class ACreator extends MyCreator { def newMessage = SomeMessage("hello") }

然后,newMessage在这里将有成员creator引用ACreator本身的实例。

现在,我有一堆案例类可以做同样的事情。我的问题是,每次我想定义这样的案例类时,你怎么会重复这种模式而不必复制和粘贴(implicit val creator:MessageCreator)

我尝试使用隐式val定义一个抽象类,然后从case类继承它们,但Scala抱怨说抽象类的隐式val没有在case类中定义。显然,案例类不能被继承。

如果无法以编程方式完成,我可能会开始考虑编写一个宏(这将是一个很好的解决方案)。我想确保我在这里没有遗漏任何东西。

1 个答案:

答案 0 :(得分:1)

在不了解更多关于域名的情况下,我会提出一些问题:

  1. 为什么你的工厂不能成为你的伴侣?对于一个case类,由于语言和它的编译器,这已经明确了。如果你需要另一个,我会重载申请。

  2. 为什么你的班级需要创造更多自己的能力?这不是“副本”的部分内容(部分我的意思是没有替换所有字段。)

  3. 我会问这些问题的季节是,没有背景,听起来你已经引入了额外的复杂性而没有太大的好处。

    最后,如果你暗中通过状态,我会提醒你不要这样做。这可能导致各种问题和问题。 Implicits很棒,除非它们导致错误,在这种情况下,bug变得难以破译和追踪。我几乎要说你应该只使用隐式类型类