2011-07-13 30 views
2

我得到隊列例子有點混淆了兩件事情:Scala的特徵和在第二次的Scala編程超例子編

問題1:爲什麼BasicIntQueue的方法沒有override關鍵字。

這裏的示例代碼:

abstract class IntQueue { 
    def get(): Int 
    def put(x: Int) 
} 

import scala.collection.mutable.ArrayBuffer 
class BasicIntQueue extends IntQueue { 
    private val buf = new ArrayBuffer[Int] 
    def get() = buf.remove() 
    def put(x: Int) { buf += x } 
} 

它不應該是:

//class BasicIntQueue ... 

    override def get() = buf.remove() 
    override def put(x: Int) { buf += x } 

我已經實現覆蓋和預期的結果是一樣的。

問題2:爲什麼超級特質?

trait Doubling extends IntQueue { 
    abstract override def put(x: Int) { super.put(2 * x) } 
} 
class MyQueue extends BasicIntQueue with Doubling 

我試過它沒有super關鍵字,它失敗了。我畫了一個UML圖,但有一些模糊的推理爲什麼。

abstract override def put(x: Int) { super.put(2 * x) } 

這條Doubling方法覆蓋了BasicInQueue的方法嗎?如果是這樣,爲什麼我們需要超級?爲什麼我們不能只是做:

abstract override def put(x: Int) { 2 * x } 

對於我來說,上面的線將只覆蓋BasicInQueue的方法用一個新放的實現?抽象覆蓋關鍵字是在運行時進行某種堆棧操作的,對嗎?無論如何,我們爲什麼需要超級?超級指的是什麼?無論左邊是什麼?因此,BasicIntQueue with Doubling是DoubleI指的BasicIntQueue中的超級關鍵字?

謝謝你,爲你的時間。

回答

6

對於問題1,IntQueue被聲明爲抽象,且方法是虛擬的。因此,BasicIntQueue不是重寫方法,而是提供所需的實現。如果IntQueue中的方法具有實體,則BasicIntQueue需要在其方法上使用override關鍵字。

對於問題2,super指的是特徵方法重寫的方法。特性要求類定義了put方法,但不是完全替換它,而是通過將發送給它的值加倍來擴充它。

abstract override def put(x: Int) { 2 * x } 

不會工作,因爲它實際上並沒有放任何東西在排隊,其實因爲該函數是單位(沒有返回值),它不會做任何事情。

​​

需要發送到put值,雙打,然後調用原始put方法實際上它添加到隊列中。