2011-02-14 30 views
16

在許多Android方法中,尤其是構造函數和重載方法,您應該甚至必須使用super()調用父類方法。當您使用Eclipse 源>覆蓋/實現方法...您從模板獲取代碼TODO標籤是這樣的:Android Eclipse Plugin生成的代碼中的super()調用的位置可靠嗎?

public MyCanvas(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    // TODO Auto-generated constructor stub 
} 


@Override 
protected void onDraw(Canvas canvas) { 
    // TODO Auto-generated method stub  
    super.onDraw(canvas); 
} 

我不明白exacly在每種情況下的超做什麼,所以我總是將我的代碼插入// TODO標籤的確切位置。在這個例子中,我將在構造函數中的代碼之前以及在onDraw()中的代碼之後調用super()。

我可以在生成的代碼中始終依賴這些代碼插入位置嗎?什麼時候調用super()會有簡單的規則/解釋嗎?

+0

雖然我認爲這個問題是回答 - 謝謝 - ,我不喜歡結果。考慮到API設計和責任分離,我相信應用程序員不應該查看API的源代碼來了解發生了什麼。我想知道是否以及何時調用super()查看API文檔。也許應該努力記錄這些方法在API類中的確切含義。例如,如果View.onDraw()不做任何事情,我寧願將它放在出於性能方面的原因,但如果我這麼做了,我並不確定。 – 2011-02-15 03:33:12

回答

14

這是一個很好的問題。不幸的是,這不是一個簡單的規則。你需要知道超類的實現。有時(如在View.onDraw()中),超類實現什麼都不做;調用super()既無害又不必要。在其他情況下(例如Activity.onCreate()),超類實現執行必須在子類處理中的某個點執行的關鍵操作。有時在你調用super()時發生的事情應該在子類中的任何處理之前發生,有時在其他點上。有時候你想用自己的方法完全替換超類的處理,在這種情況下,你根本不會調用super()。您可以完全自由地在您的子類邏輯中的任何時刻(甚至在多個點)調用超類版本。

在構造函數中,對超類構造函數(如果存在)的調用必須是方法中的第一件事。如果沒有,編譯器會自動向超類中的無參數構造函數插入一個調用。 (如果超類沒有無參數構造函數,或者子類無法訪問它,編譯器會產生錯誤。)

如果文檔沒有提供足夠的信息,那麼您必須查看源代碼。 Android代碼可用 here (薑餅版本)。 API代碼在core之下。

編輯該代碼不再在git.kernel.org上可用。這裏有另外兩個地方,你可以瀏覽代碼:

的主要代碼庫中存放的平臺>框架>基礎

3

我可以永遠依靠在生成的代碼,這些代碼插入位置?

沒有,有時候你不想叫super.method。有時你想先打電話,有時在最後一個地方等等,這要看情況。但是,我正在談論的方法,沒有構造函數。

有一個簡單的規則/解釋時,將調用超()?

你總是要super因爲以前的答案要點。唯一不叫超級的情況是超級類的構造函數沒有參數;在這種情況下,編譯器會爲您提供super

我不exacly明白什麼是超確實在每種情況下,所以我總是在// TODO標籤

如果您有疑問的確切位置插入我的代碼(我在談論超級方法),你總是可以看看源代碼。谷歌代碼搜索是一個很好的資源。然後你可以決定是否把你的代碼放在super方法之前或之後;甚至,根本不要採用超級方法。

請記住,不要把超級方法在編譯時有效。但是,除非您調用super方法(例如Activity類的onResume方法),否則android上的某些方法將不起作用。

另外,有時您會決定是否在運行時運行超級方法。考慮這個經典的例子:

@Override 
public boolean onKeyUp(int keyCode, KeyEvent event) { 
    if(KeyEvent.KEYCODE_BACK == event.getKeyCode()){ 
     return true; 
    } 
    return super.onKeyUp(keyCode, event); 
} 

如果用戶按下後退鍵,您將不會調用超級方法。如果用戶沒有,則將工作委託給超級方法。

相關問題