3

当我在 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 定义一个抽象类,然后从案例类继承它们,但 Scala 抱怨抽象类的隐式 val 没有在案例类中定义。显然,case 类不能被继承。

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

4

1 回答 1

1

在不了解该领域的情况下,我会提出以下问题:

  1. 为什么你的工厂不能成为你的伴侣对象?对于案例类,由于语言及其编译器,这已经是明确的。如果您需要另一个,我会超载申请。

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

我要问这些问题的季节是,在没有上下文的情况下,听起来你已经引入了额外的复杂性而没有太多好处。

最后,如果您隐含地传递状态,我会警告您不要这样做。这可能会导致各种问题和问题。除非它们引起错误,否则隐式非常棒,在这种情况下,该错误变得难以破译和追踪。我几乎会说你应该只对类型类使用隐式

于 2013-06-05T11:41:22.997 回答