Хорошо, поэтому я использую Objective-C.Теперь, скажем, у меня есть:
TopClass : NSObject
- (int) getVal {return 1;}
MidClass : TopClass
- (int) getVal {return 2;}
BotClass : MidClass
- (int) getVal {return 3;}
Затем я помещаю объекты каждого типа в NSMutableArray и вынимаю один.То, что я хочу сделать, это запустить функцию getVal для соответствующего типа объекта, но когда я помещаю
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];
Но, конечно, мне не нужно этого делатьполучить нужную мне функциональность?В противном случае мне придется добавить оператор для каждого отдельного подкласса, и что еще хуже - добавить новую строку, если я добавлю новый подкласс, который, скорее, побеждает точку переопределения метода, не так ли?
Конечно, есть лучший способ?