2014-02-15 36 views
3

我想創建一個具有基類和2個子類的類集羣。創建基類的實例應根據某些條件返回子類,但直接創建子類應創建它。我在基類中寫了下面的代碼:在編譯時靜態超綁定?

+ (id)allocWithZone:(NSZone *)zone { 
    // prevent infinite recursion 
    if ([self isEqual:Base.class]) { 
     // if self is the base class, return a correct subclass 
     if (somecondition) { 
      return [SubclassA alloc]; 
     } 
     return [SubclassB alloc]; 
    } 
    // otherwise, alloc is called on a subclass 
    // call NSObject's alloc 
    return [super allocWithZone:zone]; 
} 

它的工作原理,但我真的很驚訝它的確如此。也就是說,當在一個子類上調用時,爲什麼super評估的是Base類的超類(NSObject),而不是Base類(因爲在SubclassA上調用,超類是Base)?就好像從Base繼承的allocWithZone:方法調用一樣,總是相對於Base評估爲super,而不是調用者的實際運行時類。我認爲Java和其他OO語言中的類似代碼不起作用並導致無限遞歸,是嗎?這段代碼錯了嗎?

回答

2

您的代碼是正確的。 [super ...]總是使用實現該方法的類的超類。在你的代碼中,+allocWithZone:由類Base實現,因此[super allocWithZone:zone]在搜索下一個要調用的+allocWithZone:實現時使用Base的超類。

+0

這是記錄在某處嗎?我試着在鏗鏘文檔中找了一下,但沒有找到它。 – wujek