Току-що започнах да изучавам Objective-C, чета Програмиране в Objective-C 3-то издание от Стивън Г. Кочан.
Има параграф, обясняващ механизма на полиморфизма:
По време на изпълнение системата за изпълнение на Objective-C ще провери действителния клас на обекта, съхранен вътре в dataValue1(идентификационен обект) и ще избере подходящия метод от правилния клас за изпълнение. Въпреки това, в по-общ случай, компилаторът може да генерира неправилен код, за да предаде аргументи на метод или да обработи неговата върната стойност. Това би се случило, ако един метод вземе обект като аргумент, а другият взе стойност с плаваща запетая, например. Или ако единият метод е върнал обект, а другият е върнал цяло число, например. Ако несъответствието между два метода е просто различен тип обект (например методът add: на Fraction приема обект Fraction като свой аргумент и връща един, а методът add: на Complex взема и връща Complex обект), компилаторът ще все още генерира правилния код, тъй като адресите на паметта (т.е. указателите) така или иначе се предават като препратки към обекти.
Не разбирам съвсем, че първата част на параграфа казва, че компилаторът може да генерира неправилен код, ако декларирам 2 метода в различни класове с едно и също име и различен тип аргументи. докато последната част от параграфа казва, че е добре да има 2 метода с едно и също име и различни аргументи и връщани типове... о, не...
Имам следния код и той се компилира и работи добре:
@implementation A
- (int) add:(int)a {
return 1 + a;
}
@end
@implementation B
- (int) add: (B*) b {
return 100;
}
@end
id a = [[A alloc] init];
id b = [[B alloc] init];
NSLog(@"A: %i, B %i", [a add:100], [b add:b]);
Редактиране: Както цитирах текста, кодът по-горе би трябвало да причинява грешки, но извежда само някои предупредителни съобщения, Намерени са множество методи с име „add:“, Несъвместим указател към изпращане на целочислено преобразуване "id" към параметър от тип "int"
Имам опит в Java и C++, знам, че полиморфизмът в Objective-C е малко по-различен от този на тези езици, но все още съм объркан относно несигурността (текстът е с удебелен шрифт).
Мисля, че трябва да съм разбрал нещо погрешно, бихте ли обяснили по-подробно за динамичното обвързване в Objective-C за мен и тези, които се нуждаят от него?
Благодари ти!