2012-02-28 22 views

回答

6

這裏說到:

它短,abstract override def m()允許地方型的呼叫從方法super.m()和這個超級呼叫界限dynamicaly創造,當一個特質混合在種所有其他類型,例如

trait Printer { 
    def print(msg: String) 
} 

trait Shouter extends Printer { 
    abstract override def print(msg: String) { super.print(msg + "!") } 
} 

class ConsolePrinter extends Printer { 
    def print(msg: String) { println(msg) } 
} 

val loudPrinter = new ConsolePrinter with Shouter 

loudPrinter.print("Scala is great") 

在這裏,我們的混合式呼喊後,輸入線性化後變成了「呼喊延伸ConsolePrinter」,並super.print()通話變得ConsolePrinter.print(),它給我們:

Scala is great! 

谷歌更多的「堆疊特質模式」,這是一件了不起的事! :)

哎......我忘了有關Java :)

對於給定的例子中,我們有Shouter.class - 接口呼喊與方法:

[0] Shouter$$super$print 
    [1] print 

接下來,呼喊$類的.class - 名爲「呼喊$類」用靜態方法print(LShouter;Ljava/lang/String;)V和身體具體類:

0 aload_0 
1 new #8 <scala/collection/mutable/StringBuilder> 
4 dup 
5 invokespecial #12 <scala/collection/mutable/StringBuilder.<init>> 
8 aload_1 
9 invokevirtual #16 <scala/collection/mutable/StringBuilder.append> 
12 ldC#18 <!> 
14 invokevirtual #16 <scala/collection/mutable/StringBuilder.append> 
17 invokevirtual #22 <scala/collection/mutable/StringBuilder.toString> 
20 invokeinterface #28 <Shouter.Shouter$$super$print> count 2 
25 return 

也就是說,呼籲通過實例方法Shouter$$super$print(String)

接下來,$$anon$1.class - 具體類名爲「$ anon $ 1」 - 這是我們的new ConsolePrinter with Shouter。它實現了接口Shouter,也就是說,它的方法實現了。在這裏:

print(Ljava/lang/String;)V 

0 aload_0 
1 aload_1 
2 invokestatiC#21 <Shouter$class.print> 
5 return 

Shouter$$super$print(Ljava/lang/String;)V

0 aload_0 
1 aload_1 
2 invokespecial #11 <ConsolePrinter.print> 
5 return 

也就是說,在被稱爲print()我們調用static Shouter$class.print()這是從呼喊特質的實現。該打印文件添加!並在我們的對象上調用Shouter $$ super $ print(),並且我們將調用轉發給ConsolePrinter。

這是它。