在scala中使用多级继承和通过使用“ with”关键字在1级中使用所有级别的区别

时间:2019-06-13 09:39:47

标签: scala traits extends

我是一名Java开发人员,最近学习了scala。任何人都可以帮助您了解这种困惑。

假设我具有以下代码结构。

abstract class A {
  val message: String
}
class B extends A {
  val message = "I'm an instance of class B"
}
trait C extends A {
  def loudMessage = {message.toUpperCase()}
}
class D extends B with C

现在的问题是关于代码的最后一行:当我们在D中扩展类B时,B已经包含了类A的成员。为什么我们应该这样写?有什么区别吗?

非常感谢您阅读我的问题。对于正在思考和回答的人,请不要恭维。

1 个答案:

答案 0 :(得分:1)

没有什么区别,因为扩展类B后,您获得了消息部分,进一步混合了也需要消息的特征C,但是我们已经从B得到了消息,现在也从C得到了LoudMessage。

Wikipedia-

复制
  

一个类只能从一个类继承,但可以混入多个   所需的特征。 Scala使用右先解析方法名称   在消除所有“特征”之前,先进行深度“扩展”特征的深度优先搜索   每个模块在结果列表中的最后一次出现。

这解决了钻石问题(多重继承)。

写特质并在必要时将其混合在类中是一种普遍做法,在编写单元测试,在特质中创建大量假数据/模拟并在任何时候将它们混合时,您会发现它们非常有用。 / p>