为什么人们定义对象扩展其伴生类?
我发现这种代码在Lift框架中很常见,写法如下:对象 BindHelpers 扩展 BindHelpers {}
这意味着什么?
I find this kind of code is very common in Lift framework, written like this:object BindHelpers extends BindHelpers {}
What does this mean?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
在这种情况下,BindHelpers 是一个特征而不是一个类。让
foo()
成为BindHelpers
中定义的方法,您可以访问它。通过伴生对象使用它:
BindHelpers.foo()
混合在类中混合特征
BindHelpers
,从而能够访问其中的方法。例如:
Scalatest 中的
ShouldMatchers
使用了相同的技术。In this case,
BindHelpers
is a trait and not a class. Letfoo()
to be a method defined inBindHelpers
, to access it you can either.Use it through the companion object:
BindHelpers.foo()
Mix the trait
BindHelpers
in a class and thus be able to access the methods inside of it.For instance:
The same techniques is used in Scalatest for
ShouldMatchers
for instance.您可以找到 David Pollak 的回答 liftweb 组中有同样的问题。
You can find David Pollak's answer to the same question in the liftweb group.
对象
扩展其伴生类很有趣,因为它将具有与该类相同的类型。如果
object BindHelpers
没有扩展BindHelpers,它将是BindHelpers$
类型。It's interesting for an
object
to extend its companion class because it will have the same type as the class.If
object BindHelpers
didn't extend BindHelpers, it would be of typeBindHelpers$
.这里的模式可能是其他的。我不知道 Lift 可以回答这个问题,但是
object
存在一个问题,因为它们不可模拟。因此,如果您在可以模拟的class
中定义所有内容,然后让对象扩展它,您就可以模拟该类并在测试中使用它而不是对象。It might be that the pattern here is other. I don't know Lift to answer this, but there's a problem with
object
in that they are not mockable. So, if you define everything in aclass
, which can be mocked, and then just makes the object extend it, you can mock the class and use it instead of the object inside your tests.