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語言中的類似代碼不起作用並導致無限遞歸,是嗎?這段代碼錯了嗎?
這是記錄在某處嗎?我試着在鏗鏘文檔中找了一下,但沒有找到它。 – wujek