好的,所以我使用Objective-C。現在,假設我有:Obj-c方法重載/多態問題
TopClass : NSObject
- (int) getVal {return 1;}
MidClass : TopClass
- (int) getVal {return 2;}
BotClass : MidClass
- (int) getVal {return 3;}
然後,我將每種類型的對象放到一個NSMutableArray中並取出一個。我想要做的是運行在適當的對象類型的GETVAL FUNC,但是當我把
id a = [allObjects objectAtIndex:0];
if ([a isKindOfClass:[TopClass class]])
{
int i;
i = [a getVal];
}
我首先得到一個有關多種方法稱爲GETVAL(警告可能是因爲編譯器不能確定實際的對象類型直到運行時)。但更嚴重的是,我也會得到一個錯誤「void value不應該被忽略,因爲它應該是」並且它不會被編譯。
如果我不嘗試使用[a getVal]的返回值,那麼它會編譯好的例如
[a getval]; //obviously no good if I want to use the return value
如果在運行函數之前使用isMemberOfClass語句將對象轉換爲類,它也可以工作,例如,
if ([a isMemberOfClass:[BotClass]) i = [(BotClass*) a getVal];
但是當然,我不應該這樣做才能獲得我需要的功能嗎?否則,我將不得不爲每個單獨的子類聲明一個語句,如果我添加一個新的子類,則必須添加一個新行,而這又不利於方法覆蓋。
當然有更好的方法嗎?
你不應該在Objective-C'-getSomething'中命名一個方法,你只需將它命名爲'-something'。 – 2010-06-10 20:00:41