2011-07-28 92 views
20

我在計算小時時遇到了一些麻煩,無法準確覆蓋我的一個子類中的方法。Objective-C - 子類中的覆蓋方法

我有另一個customclass的亞類(ClassB的)(ClassA的):

@interface ClassB : ClassA { 
} 

和內ClassA,有一種叫做方法:

-(void)methodName; 

其正確觸發。

但是,我需要這種方法在ClassB中觸發。

我試圖實現(在ClassB):

-(void)methodName { 
    [super methodName]; 
} 

,但它仍然不會ClassB火。

如何覆蓋methodName以便在ClassB中觸發?

+0

你如何初始化對象? – Thys

回答

25

你只需要添加自定義代碼的方法名在CLASSB:

- (void)methodName 
{ 
    // custom code 

    // call through to parent class implementation, if you want 
    [super methodName]; 
} 
+6

這正是他已經做的...... –

+3

他沒有說他在哪裏放置了他的代碼。此外,這是做這件事的正確方法。 –

+0

您不必刪除[super methodName];在classB中運行methodName .. –

18

首先,確保你的init方法創建一個ClassB對象而不是一個ClassA(或別的東西)對象。

然後,如果你想創建一個完全不同的CLASSB(無效)方法名:方法比在ClassA的發現,這是要走的路:

中超是超類。通過調用[super methodName],您要求ClassA執行它自己的methodName。 如果您想完全重寫classA中的methodName,請不要調用super。

所以,基本上,在你CLASSB的實現方法名的:

-(void)methodName { 
    // Remove [super methodName] 
    // Insert the code you want for methodName in ClassB 
} 

隨時閱讀蘋果的Objective-C編程語言文檔中Messages to self and super

+0

這不是這個問題的正確答案嗎? – arqam

0

寫:

-(void)methodName { 
    [super methodName]; 
} 

告訴編譯:當執行B類的方法名,調用它的父類的方法名( A類)。所以如果你想讓B類做一些不同的事情,你必須編寫代碼來產生不同的行爲。像這樣:

-(void)methodName { 
    NSLog(@"Hello, world!"); 
} 

現在通過調用B類的methodName「Hello,world!」將被打印在控制檯上。

0
-(void)methodName { 
    [super methodName]; 
} 

想要調用methodName(在ClassB中),只需刪除[超級方法],然後你就可以觸發它了。 原因超級回撥給A類

-1

雖然這個問題太舊了,但是每個專家都有一些學習者,下面是引用Apple文檔。「 」新方法必須具有相同的返回類型,並採用與您覆蓋的方法相同的參數數量和類型。「 完整答案可以在Apple method overriding documentation 找到希望這可以幫助別人。

+0

堆棧溢出不應複製所有文檔。由於OP沒有做這個錯誤,這不能回答這個問題。 – vikingosegundo