Scala中“静态”方法的特征?

时间:2013-07-19 19:52:49

标签: scala static traits

是否有混合特性来访问“静态”方法的功能,而不是使用这些方法导入对象?

假设我们想要访问方法a()的功能。我们是否会扩展包含a()的特征而不是导入包含a()的对象?

如果我们看一下以下例子:

1)

trait A {
  def a() {}
}

...

class B extends A {
  val b = a()
}

VS

2)

object A {
  def a() {}
}

...

import A._
class B {
  val b = a()
}

是否有理由更喜欢第一种方法,即使两个类BA之间没有“is-a”关系?

2 个答案:

答案 0 :(得分:4)

也许延伸B的内容不想继续重新导入A

也许该方法依赖于其他“静态”方法,但您实际上想要覆盖实现?

如果B是最终的(或对象)且方法确实是静态的(并且没有引用您可能想要在B中更改的实现),那么没有太多意义混合特性。唯一的例外是如果定义了隐式转换,如果你混合使用隐式转换,它的优先级将低于你自己声明它的优先级。

(请查看scala.LowPriorityImplicits混合到scala.Predef中的示例。)

答案 1 :(得分:2)

雷克斯说的一切......

请记住,import将工件(方法,字段)带入当前范围,但不会在新类的界面上公开它们。

混合特征可以通过使其成为新类/特征界面的“一部分”来公开工件(公共,受保护或......)。