是否有混合特性来访问“静态”方法的功能,而不是使用这些方法导入对象?
假设我们想要访问方法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()
}
是否有理由更喜欢第一种方法,即使两个类B
和A
之间没有“is-a”关系?
答案 0 :(得分:4)
也许延伸B
的内容不想继续重新导入A
?
也许该方法依赖于其他“静态”方法,但您实际上想要覆盖实现?
如果B
是最终的(或对象)且方法确实是静态的(并且没有引用您可能想要在B
中更改的实现),那么没有太多意义混合特性。唯一的例外是如果定义了隐式转换,如果你混合使用隐式转换,它的优先级将低于你自己声明它的优先级。
(请查看scala.LowPriorityImplicits
混合到scala.Predef
中的示例。)
答案 1 :(得分:2)
雷克斯说的一切......
请记住,import
将工件(方法,字段)带入当前范围,但不会在新类的界面上公开它们。
混合特征可以通过使其成为新类/特征界面的“一部分”来公开工件(公共,受保护或......)。