2011-09-15 67 views
0

之間的雙向通信[對不起我的英語弱]類和超

我有我的五個具體,但similiar,類B1B2B3B4B5我共同的超S

我想把'common'(類似於每個B的)代碼放到S中(並且由[super myCommonFunction]來調用它)。

它應該是好的,但問題是,myFunction的需要從調用內從B1一個 特定功能,B2B3B4B5(這是不帶參數的類型相同的功能,甚至可以有相同的名字在每個),

如何從'超類'調用self方法?

+0

您想從S中調用B1中的方法(或其他B中的某個方法)嗎? – onnoweb

+0

是的,我想從S中調用B1,B2,B3,B4,B5中的一個方法(取決於S實際是哪個部分); (我想打電話給B1-> S-> B1,B2-> S-> B2等) – fir

+0

我想從我的B17或B45調用S方法,也讓S執行B17或B45功能(只需要我通過將它移動到S來重用我在B中重複使用的一些函數,但是我不僅需要在S中調用,而且還要讓它在這裏回調我的東西:)如果我可以在S中調用'empty'函數,它將'鏈接「與B1-B5中的功能相當,那就沒關係,我會檢查它 – fir

回答

3

您需要做的就是聲明您想要在超類中調用的方法,如果需要,可以將其保留爲空體或提供默認實現。

然後,您只需在每個子類中提供更多的實現,即覆蓋的超類方法。

然後,當您需要從超類調用方法時,只需使用[self myMethod],而將調用正確的子類方法。

+0

TNX它可能是 – fir

-1

據我所知,你想調用S類的不同方法,這取決於你的子類是commonFunction嗎?如果是這樣 - 你可以檢查self的實例,而不是調用[super commonFunction],而是改爲[self commonFunction]。這將自動調用[super commonFunction],因爲self繼承自super

+0

你不能說''self'從'super'繼承」,這是一種無意義的。自我和超級都代表了對象。發送消息給self或者super注意改變消息適用於哪個對象。 'super'只是編譯器在類層次結構中的特定位置啓動方法查找的指示。更確切地說,查找開始於使用super的超類。類可以相互繼承,但實例不能。無論如何,自我和超級是完全相同的對象(自我=超級)。 – mathk

+0

我不太明白 - 但我想也許我想要的是相反的;我不想調用超級方法 - 我想讓可能超級調用它的'實際'孩子 – fir

+0

@mathk - 我的觀點是因爲'B'從'S'繼承,調用'[b1 someMethod]'將會如果'B'沒有被覆蓋,則從'S'類調用'someMethod'。 – Eimantas

0

@Tom建議的方法是我會使用的方法,如果我確定後代類中的方法始終具有相同的名稱。如果名稱可以根據任意條件而變化,那麼這是另一種非常靈活的方法。您需要更改方法簽名以符合您的要求:

typedef id (^common_function_callback_t)(void); 

@interface S : ... 
    - (id) commonFunctionWithCallback:(common_function_callback_t) callback; 
@end 

@implementation S 
- (id) commonFunctionWithCallback:(common_function_callback_t) callback 
{ 
    // ... 
    id someIntermediateResult = callback(); 
    // ... 
    return someFinalResult; 
} 
@end 

@implementation B1 // Similar for all other B's 
- (id) myFunction 
{ 
    id someThing = ...; 
    id someStuff = [self commonFunctionWithCallback:^() { 
      return someThing; 
     }]; 
    // ... 
    return someOtherResult; 
} 
@end 
+0

tnx,它稍微複雜一點,我想改變我的B的方法名稱(實際上他們有不同的名字,但做同樣的事情在視圖上安排精靈 - 所以我可以命名他們--arrangeSprites ) - 但tnx回答它可能是有用的,我希望重新考慮它L8R – fir