我是一名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的成员。为什么我们应该这样写?有什么区别吗?
非常感谢您阅读我的问题。对于正在思考和回答的人,请不要恭维。
答案 0 :(得分:1)
没有什么区别,因为扩展类B后,您获得了消息部分,进一步混合了也需要消息的特征C,但是我们已经从B得到了消息,现在也从C得到了LoudMessage。
复制一个类只能从一个类继承,但可以混入多个 所需的特征。 Scala使用右先解析方法名称 在消除所有“特征”之前,先进行深度“扩展”特征的深度优先搜索 每个模块在结果列表中的最后一次出现。
这解决了钻石问题(多重继承)。
写特质并在必要时将其混合在类中是一种普遍做法,在编写单元测试,在特质中创建大量假数据/模拟并在任何时候将它们混合时,您会发现它们非常有用。 / p>