3

在某些情况下,最好混合特征来访问“静态”方法的功能,而不是使用这些方法导入对象?

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

如果我们看下面的例子:

1)

trait A {
  def a() {}
}

...

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

对比

2)

object A {
  def a() {}
}

...

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

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

4

2 回答 2

4

也许扩展的东西B不想继续重新导入A

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

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

(查看scala.LowPriorityImplicits其中混入scala.Predef的示例。)

于 2013-07-19T20:15:29.673 回答
2

雷克斯所说的一切……

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

混入一个特征可能会暴露工件(公共的、受保护的或......),方法是使它们成为新类/特征接口的“一部分”。

于 2013-07-19T20:22:03.497 回答