我是scala的新手。我正在学习特质,似乎他们可以有具体的方法。这是我写的代码。
trait A{
def print : Unit = {
println("I am in A")
}
}
trait B{
def print : Unit = {
println("I am in B")
}
}
trait C {
def print : Unit = {
println("I am in C")
}
}
class D extends A with B with C{
}
object Main extends App {
val d: D = new D
d.print
}
显然会出现编译错误。编译器要求我覆盖 D 中的打印方法。我不想写一个新方法。我只想选择 C 的打印方法。有什么办法我只能选择 C 的打印方式吗?我希望我已经说清楚了。如果这个问题听起来很愚蠢,我很抱歉。我在尝试学习。提前谢谢。
答案 0 :(得分:3)
@ S.K,所以我混入的最后一个特性是超类?
如果你查看Scala trait的文档,每当scala编译器看到任何带有多个父scala编译器的类时,都会将所有类放在可堆叠的形式中。
所以如果 A扩展B与C 将变为 - > A-> B-> C,当您从基类A调用super时,它将考虑类似C-> B(C然后B)的方法。
同样如果你使 A扩展C与B 将成为 - > A-> C-> B,当你调用它时,编译器将考虑B-> C(B然后是C)。
请在下面的链接中查看有关scala trait可堆叠的更多详情。
答案 1 :(得分:0)
我同意S.K在D类中要覆盖的问题是什么。
使用C扩展D类的一种方法是在没有覆盖的情况下如何在C中获得方法的句柄?
您必须覆盖才能调用它的方法。