Objective-C のクラス継承に関連する奇妙なシナリオに遭遇しました。
基本クラス X から継承する 3 つのクラス A、B、および C があるとします。クラス A、B、および X にはコンストラクターがあります。
- (id)InitWithString:(NSString*)someString andDelegate:(id<SomeProtocol>)aDelegate
唯一の違いは、すべてのクラスがデリゲートに異なるプロトコルを使用することです。
A と B に対して、コンパイラは C のメソッドを使用しようとします。警告は、クラス C のコンストラクターが必要とするプロトコルが提供されたデリゲートによって実装されていないことを通知します。各クラスには、クラス独自のコンストラクターに適切なプロトコルを実装するデリゲートがあるため、デリゲート自体に問題はありません。実行時にはすべてが正常に機能し、すべてのクラスに対して適切な関数が呼び出されます。
コンストラクターが匿名 ID の代わりに A*、B*、または C* を返すようにしてみましたが、それでも問題は解決しません。
機能する唯一のことは、次のように適切なクラスにキャストすることです。
instanceOfA = [(A*)[A alloc] InitWithString:@"" andDelegate:aDelegate];
これは余分で不必要に思えます。私はおそらくここで明らかな何かを見逃しています。