Я только начал изучать Objective-C, я читаю Программирование в Objective-C, 3-е издание Стивена Г. Кочана.
Есть параграф, объясняющий механизм полиморфизма:
Во время выполнения система выполнения Objective-C проверит фактический класс объекта, хранящегося внутри dataValue1 (объект id), и выберет соответствующий метод из правильного класса для выполнения. Однако в более общем случае компилятор может сгенерировать неправильный код для передачи аргументов методу или обработки его возвращаемого значения. Это могло бы произойти, если бы один метод принял объект в качестве аргумента, а другой принимает, например, значение с плавающей запятой. Или, например, если один метод вернул объект, а другой - целое число. Если несоответствие между двумя методами - это просто объект другого типа (например, метод add: Fraction принимает объект Fraction в качестве аргумента и возвращает его, а метод сложного add: принимает и возвращает объект 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 для меня и тех, кому это нужно?
Спасибо!