2012-12-21 26 views
6

維基百科將「超級電話」分類爲反模式,我不明白爲什麼。該模式在objective-C/cocoa中使用相當頻繁;例如init/dealloc,drawrect,awakefromnib都需要你調用super。我在這裏誤解了這個概念嗎?根據維基百科,爲什麼「超級通話」被認爲是反模式?

的文章鏈接:http://en.wikipedia.org/wiki/Call_super

+0

您能否提供源代碼?調用super只是面向對象編程的一部分,我不知道爲什麼這應該是反模式。 – NSAddict

+0

鏈接到相關的維基百科文章? (記得維基百科是合作編輯的,他們可能會錯)。 – driis

+0

這個問題被標記爲「不具有建設性」,這真的很難過。我發現它非常重要 – Kuba

回答

13

因爲它在the article,說,這是必要性調用超級方法是反模式,即超類「預計」你要覆蓋的方法,使功能完整 - 但它沒有明確地表達這種期望。它也希望你稱之爲超級實現。兩者都是程序工作所必需的。

這是一個反模式,因爲程序員的意圖不能從代碼推導出來。如果你的同事決定處理這個問題,他們不會知道你期望這個班級做什麼,因此可能會遇到問題和/或刺激。

因此,如果您希望某個方法的某些部分被覆蓋,但其他東西需要保留,建議使用template method pattern,您可以在其中保留所有不可替換的內容(私有)方法,然後調用另一個 - 完全分開 - ,其中必須必須執行才能使程序運行(在某些語言中,否則將不會編譯)。 通過這種方式,您可以確保重要的東西仍然存在,擴展班級的人員將確切地知道該做什麼,同時保持對其他實施細節的無知。

Objective-C沒有抽象或虛擬方法,但是如果調用super方法,則可以通過顯式引發異常來實現相同的效果。這樣,如果您的同事忘記重寫該方法,程序將會崩潰 - 並且會崩潰並顯示一條錯誤消息,他們會理解這些錯誤消息,這將使他們能夠比一些不穩定的情況更快,更容易地理解和解決問題行爲沒有解釋,由於功能不完整。

+0

糾正我,如果我錯了,但在Objective-C中有模板嗎? – 2012-12-21 16:58:49

+0

但這不是OP詢問的問題。 – 2012-12-21 17:00:54

+0

他問爲什麼叫超級是反模式,是正確的。我回答說,不是嗎? – weltraumpirat

3

問題的要點是:

..However,事實上,語言本身可能無法 強制規定在此呼籲所有的條件是什麼使這一個 反模式。

因此,作者是關於程序員必須做某些他們認爲語言應該爲他們做的事情的肛門。

的wikepedia文章Call Super中提到的解決辦法是:

一種更好的方法來解決這些問題的是代替使用該模板 方法模式,其中超類包括純粹抽象方法 必須實現由子類並有原始的 方法調用該方法

問題是Objective-c沒有虛函數。它只有消息,所以你不能實現wikepedia所建議的。

+0

那麼爲什麼模板模式比超級調用更好? – eyebrowsoffire

+0

@eyebrowsoffire看到我的編輯 –

+1

@雖然彼得說沒有虛函數是正確的,但很容易產生類似的語義(例如參見http://stackoverflow.com/questions/13793864/abstract-class-for-objective- C/13797335#13797335)。所以如果你希望你可以實現模板模式。 – CRD