2010-11-05 20 views
0

基本上我有一個父超類,即稱爲MAMMAL。哺乳動物默認擴展UIImageview。現在我有老虎班,輪流擴展MAMMAL班,哺乳動物班也有乳房餵養的方法。Objective-C中的多態性和默認實現

在我的mammal.h類中,我聲明瞭breastfeedbaby方法。

現在,我希望能夠做一些事情,比如添加一個哺乳動物列表,並且擁有自己的breastfeedbaby實現,循環和排列,然後投射到哺乳動物並做[哺乳動物breastfeedbaby]。

我希望每個動物自稱breastfeedbaby方法,因爲它們全部覆蓋它,但我的問題是,如果我在那裏聲明它,它會從哺乳動物調用breastfeedbaby。

在java中,我可以使用一個接口,或者只是抽象類與抽象方法,並有不同的實現重寫方法。

這有道理嗎?我的問題是,如果我不忽略哺乳動物中的breastfeedbaby方法,它會在哺乳動物中調用breastfeedbaby方法,如果我在哺乳動物中忽略breastfeedbaby方法,則類將會變成黃色,並帶有警告說我沒有正確實施mammal.h類。如果我這樣做,動物的breastfeedbaby方法被調用。我應該在這裏使用一個協議,但是從我所瞭解的協議與java中的一個接口不同。

我不知道它是否有意義,但無論如何感謝。

回答

5

以下情形:

  • Mammal.h:- (void)method;
  • Mammal.m:- (void)method { NSLog(@"Mammal"); }
  • Monkey.h:@class Monkey : Mammal
  • Monkey.m:- (void)method { [super method]; NSLog(@"Monkey"); }
  • Somewhere.m:Mammal *monkey = [[Monkey alloc] init]; [monkey method];

應該產生:

哺乳動物

更新:當然,如果你願意,你可以刪除調用[super method]。只是表明可能性。

+0

感謝這是我所擁有的:-)。我的方法實際上被調用。只是我的圖像不是動畫,我認爲我的方法沒有被調用。愚蠢的我。顯然,我總覺得別的東西是錯的,我可能搞亂了我的動畫。 – user281300 2010-11-05 15:05:27

0

即使您將對象轉換爲MAMMAL,它仍然會調用-breastfeedbaby方法來處理它的任何子類。這是因爲Objective-C使用消息發送。

+0

如果我從哺乳動物中省略breastfeedbaby方法,那麼將調用動物breastfeedbaby方法,但哺乳類.m類是黃色的,警告說我沒有實施breastfeedbaby方法。 – user281300 2010-11-05 14:47:23

+0

在這種情況下你可以做的是實現它,但返回'nil'。 – 2010-11-05 14:51:43

+1

或者執行它並拋出異常。 – JeremyP 2010-11-05 15:09:16

2

Objective-C動態解析所有內容,因此它沒有抽象基類或接口。最接近抽象方法的是編寫一個引發異常的默認實現(在父類中)。

@implementation Mammal 

- (void)breastfeedBaby 
{ 
    [NSException raise:@"MethodNotImplemented" 
       format:@"Class %@ failed to implement required method %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd)]; 
} 

@end 

在編譯時捕獲缺少的方法會很好,但在動態類型的語言中這是不可能的。

+0

感謝大家的意見。這也有幫助。 – user281300 2010-11-05 15:11:24

+0

@dwineman:謝謝你爲我清理!小編輯:[self className]應該是[self class] – 2012-08-28 12:33:20

+0

@ElisevanLooij D'oh。謝謝! – dwineman 2012-09-04 01:39:08