Scala - 选择一个特征的方法而不是另一个

Scala - choose a method of one trait over another

我是 Scala 新手。我是学traits的,好像可以有具体的方法。这是我写的代码。

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的打印方式吗?我希望我已经说清楚了。如果这个问题听起来很愚蠢,我很抱歉。我在尝试学习。提前致谢。

我同意 S.K class D 中要覆盖的问题。

你用 C 扩展你的 D class 的一种方式,而不覆盖你如何在 C 中获得方法的句柄?

您必须重写才能调用它的方法。

@S.K, so the last trait I mix in is the super class?

如果您查看 Scala trait 的文档,每当 scala 编译器看到任何具有多个父级的 class 时,scala 编译器会将所有 classes 以可堆叠的形式放置。

so If A extends B with C 将变为 --> A->B->C 并且当您从基础 class A 调用 super 时它将考虑像 C->B (C then B) 这样的方法。

同样的方法,如果你使 A extends C with B 将变为 --> A->C->B 并且当你调用它时,编译器将考虑 B->C ( B 然后 C).

请在下面查看有关可堆叠的 scala 特征的更多详细信息 link。

Scala's Stackable Trait Pattern