在 scala 中使用多级继承与使用 "with" 关键字在 1 级中使用所有级别的区别

difference in using multi level inheritance in scala and using all the levels in 1 level by using "with" keyword

我是一名 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 中扩展 class B 时,B 已经包含 class A 的成员。为什么我们应该这样写?有什么不同吗?

非常感谢您阅读我的问题。给思考和回答的人脱帽致敬。

没有区别,因为扩展 class B,你得到了消息部分,进一步混合了特征 C,它也需要消息,但我们已经从 B 得到了它,现在我们从 C 得到了 loudMessage还有。

复制自 Wikipedia-

a class can only inherit from a single class, but can mix-in as many traits as desired. Scala resolves method names using a right-first depth-first search of extended 'traits', before eliminating all but the last occurrence of each module in the resulting list.

这解决了菱形问题(多重继承)。

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