2013-06-05 56 views
2

的隐含VAL当我写在斯卡拉与case类节目中,我遇到了一个循环模式,我希望把一个案例类的创建者作为参数,以供日后参考。我明白了,我们可以通过把隐性价值的情况下,类抽象案例类

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作为这里将有指ACreator自身的实例成员creator

现在,我有一堆case类,会做同样的事情。我的问题是,如果每次我想定义这样的案例类时,如何复制并粘贴(implicit val creator:MessageCreator),您将如何重复此模式?

我试图定义与隐VAL一个抽象类,然后从案例类继承他们,但Scala的抱怨,从抽象类的隐性VAL的情况下类没有定义。显然,case类不能被继承。

如果不能以编程方式做,我可能会开始寻找到写一个宏(这将是一个精解)。我想确保我不会在这里丢失任何东西。

+0

恕我直言,这样的参数应该明确,只有明确通过。如果你真的需要这个,你可以使用伴侣对象作为工厂来传递创建者参数。 – vitalii

+0

感谢您的评论。如果我有一个伴随对象,比如说'def apply(隐式val创建者:MessageCreator){...}',那么如何让case类继承这样的伴随对象类呢? –

回答

1

不知道更多关于它的域名我会问的线沿线的一些问题:

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

  2. 为什么你的类需要创建更多的自身的能力吗?这不是什么部分“复制”是(和部分我的意思是不替换所有字段。)

这个赛季我会问这样的问题是,没有背景的,这听起来像你”已经引入了额外的复杂性而没有太多好处

最后,如果你正在暗中穿过状态我警告你不要它。这可能会导致各种各样的问题和问题。除非它们引起了一个错误,否则它们是非常好的,在这种情况下,这个错误很难被破译和追踪。我几乎会走这么远,说你应该只使用隐式类型的类

+0

您好,感谢答案 1.当然,我可以实现与同伴对象类似的事情。但它给了什么价值?它似乎没有给我继承(或者是否)? –

+0

2.那么,让我从第一个原则进行争论。如果程序员被重复一遍又一遍地写相同的代码块同样的关注,这是很自然的,他/她认为抽象它的方式,使他/她并不需要提供姓名,以这样的事隐“创造者的价值,并依赖于不同实体共同关注的命名约定。现在,如果Scala使用同母语言,那么实现它将是非常自然的事情。随着最近向Scala添加宏,我可以使用宏来实现这一点。问题是,它可以在Scala的语义中完成吗? –

+0

和w.r.t.你最后的评论,我隐含地传递给一个类的参考。我在OP中没有提到,但问题的上下文是当演员向另一个发送消息时,我想要传递消息的发送者,以便我可以追踪演员的原始发件人。对我来说,这听起来不像传递给各州。但是,当然,可以滥用这一点并继续对原始发件人产生副作用,这是不可取的。 –