2010-04-14 45 views
4

在編寫Android應用程序時出現這個問題, ,但它似乎是一個通用編程問題。我怎麼知道何時/在哪裏調用超類的重寫方法

情況是,我從庫中擴展(子類)一個類,並重寫一個方法。我怎麼知道我是否應該調用超類的方法?什麼時候? (在重寫方法的開始或最後?)

例如,我從Android平臺的「Activity」類重寫了「public boolean onCreateOptionsMenu(Menu menu)」方法。在一個示例中,我看到有人在方法的末尾寫入「return super.onCreateOptionsMenu(menu)」。但我怎麼知道它應該這樣做呢?這是正確與否?如果我用「super.onCreateOptionsMenu(menu)」開始我的方法,有什麼區別?

BR, 亨利

+0

language agnostic? – 2010-04-14 11:51:22

回答

6

我不認爲你可以在摘要中回答這個問題:它取決於你重寫的超類方法的行爲。

根據具體情況,它可能是適當的:

  • 調用超第一
  • 調用超去年
  • 處理某些情況下,你自己(自定義),調用super爲休息
  • 永遠不會調用super

希望您所覆蓋的特定課程的文檔能夠告訴您是否/何時有必要打電話給超級。

+2

除了文檔,一些常識和經驗也會引導你在這裏。例如,你是否試圖做一些除了通常發生的事情(做調用超類方法)或者你想做什麼而不是正常行爲(不)?你的東西需要先發生還是最後纔會發生? – 2010-04-14 11:50:32

0

您不需要調用super.method(),你怎麼稱呼它,只有當你需要它,你需要它。

0

當您重寫子類中的方法時,它取決於您調用該方法的實例的類型。

例如:

Class Animal{ 
     public eat(){ 
      //.. 
     } 
    } 

    Class Dog extends Animal{ 
     public eat(){ 
      //.. 
     } 
    } 

now if you say new Dog().eat() 
it executes Dog's eat method. 

if you say new Animal().eat() 
it executes Animal's eat method. 

而且你可能有這樣的代碼

 Animal a = new Dog(); 
     a.eat(); 

爲實際實例的類型狗的再次執行狗的吃法。

1

不幸的是,這沒有規定。您需要參考API文檔,並在文檔說明您需要時調用super。

有關Android是否需要或不需要的一個提示是,如果您覆蓋的方法是生命週期方法之一。在這種情況下,你可以相當肯定你需要調用super。

1

這些都是有效的問題,但不幸的是,這裏沒有遵循一般規則。

是否需要調用超級方法取決於超級方法是否需要完成某些事情。換句話說:您是在擴展還是替換重寫的方法?一個好的API文檔應該給你答案。此外,圖書館通常遵循一些約定來明確如何使用它們。

問題的答案在哪裏放置超級呼叫取決於你想執行什麼時候你是擴展名。它是否需要在超級方法之前或之後運行?大多數情況下,你首先打電話超級,然後再做一些額外的事情但是,如果您需要爲super方法準備一些內容,例如修改某些對象狀態或操作參數,請在超級調用之前放置代碼。再次,API文檔應該在這裏給你答案。

1

如果您忘記調用super,大多數情況下Android會導致異常。 我相信,如果你不這樣做,它不會拋出,你不必打電話給超級。

在谷歌網上論壇討論的一些最佳實踐發展的生命週期方法(它們沒有正式的數據支持,而是由許多程序員使用):

  • 如果你是喜歡 一個創建方法的onCreate,的onResume等作爲第一個聲明致電超級 。因此,您可以確保準備好了超類準備的所有內容。
  • 如果您在像onSaveInstanceState這樣的關閉方法中,onPause調用super last。現在你可以確定,在你完成所有工作之前,沒有任何東西會被移除或變成壞的狀態。
相關問題