Я столкнулся со странным сценарием, связанным с наследованием классов в Objective-C.
Допустим, у меня есть три класса A, B и C, которые наследуются от базового класса X. Классы A, B и X имеют конструктор:
- (id)InitWithString:(NSString*)someString andDelegate:(id<SomeProtocol>)aDelegate
единственное отличие состоит в том, что каждый класс использует свой протокол для делегата.
Что происходит, так это то, что для A и B компилятор пытается использовать метод из C. Предупреждение сообщает мне, что протоколы, требуемые конструктором класса C, не реализованы предоставленным делегатом. В самом делегате нет ничего плохого, поскольку у каждого класса есть делегат, который реализует правильный протокол для собственного конструктора классов. Во время выполнения все работает отлично, и для всех классов вызываются нужные функции.
Я пытался заставить конструкторы возвращать A *, B * или C * вместо анонимного идентификатора, хотя это по-прежнему не решает проблему.
Единственное, что работает, это приведение к нужному классу, например так:
instanceOfA = [(A*)[A alloc] InitWithString:@"" andDelegate:aDelegate];
Это кажется излишним и ненужным. Я, наверное, здесь упускаю что-то очевидное.