Scala - 选择一种特征优于另一种特征的方法

时间:2015-03-25 05:43:38

标签: scala traits

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

2 个答案:

答案 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可堆叠的更多详情。

Scala's Stackable Trait Pattern

答案 1 :(得分:0)

我同意S.K在D类中要覆盖的问题是什么。

使用C扩展D类的一种方法是在没有覆盖的情况下如何在C中获得方法的句柄?

您必须覆盖才能调用它的方法。