2015-03-25 49 views
2

我是scala新手。我正在学习特质,似乎他们可以有具体的方法。这是我写的代码。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的打印方法?我希望我已经说清楚了。如果问题听起来很愚蠢,我很抱歉。我在尝试学习。提前致谢。

+1

什么是写这个ONELINE'覆盖D.高清打印= super.print'的问题?它只会调用C的方法。 – 2015-03-25 06:27:08

+0

@ S.K,谢谢。如果我想要B的打印或A的打印件怎么办? – 2015-03-25 06:49:38

+1

改变继承顺序,因为'D类扩展了A,C用B' – 2015-03-25 06:50:36

回答

3

@ S.K,所以我混入的最后一个特质就是超类?

如果你看看Scala trait的文档,每当scala编译器看到任何具有多个父scala的类时,编译器会将所有的类放在可堆栈的形式中。

所以如果A扩展B与C将成为 - > A-> B-> C,当你从你的基类A调用超级时,它会考虑类似C-> B(C然后B)的方法。如果你制作同样的方式A扩展C与B将成为 - > A-> C-> B,当你调用它时,编译器会考虑B-> C(B然后是C)。

请在下面的链接中查看更多关于斯卡拉特质堆栈的详细信息。

Scala's Stackable Trait Pattern

0

我与S.K同意是什么类重写一个问题,你用C和无覆盖,你怎么能得到的方法在C手柄伸出你的d类D.

的一种方式?

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