26

シナリオ
呼び出された基本クラスに、ヘッダーファイルで宣言されたAbstractRequestタイプのデリゲートプロパティがある状況があります。id <AbstractRequestDelegate>

@property (nonatomic, assign) id <AbstractRequestDelegate> delegate;

抽象デリゲートプロトコルにはいくつかの必須メソッドが含まれており、「abstract」という単語で示されているように、AbstractRequestとは両方ともAbstractRequestDelegateサブクラス/拡張されることを目的としています。

この一例は、サブクラスConcreteRequestと拡張プロトコルConcreteRequestDelegatesで、どちらも抽象メソッドに追加のメソッドを追加します。目的は、抽象クラスメソッドと具象クラスメソッドの両方が、割り当てられた単一のデリゲートインスタンスにメッセージを送信できることです。

ある時点で、ConcreteRequestは、ConcreteRequestDelegateによって定義されたデリゲートのメソッドを呼び出したいと考えています。デリゲートのタイプはidであるため、コンパイラーはこのメソッドが実装されていない可能性があることを警告します。

ConcreteRequest.m:38:警告:プロパティ'delegate'にはメソッド'-delegate'を定義する必要があります-@synthesize、@ dynamicを使用するか、メソッドの実装を提供してください

問題
この警告は正当化されます。プロパティは結局のところに入力されているからid <AbstractRequestDelegate>です。これを修正するために、具象インスタンスに割り当てられたデリゲートはタイプでなければならないことをコンパイラーに明確にしたいと思いますid <ConcreteRequestDelegate>。これは私には完全に合理的に聞こえたので、抽象プロパティをオーバーライドすることを期待して、ConcreteRequestヘッダーに新しいプロパティを追加しました。

@property (nonatomic, assign) id <ConcreteRequestDelegate> delegate;

しかし、これはコンパイラが私に同意しないところです。おそらく正当な理由があります。スーパークラスのプロパティを間違ったタイプでオーバーライドすると警告が表示されると思いましたが、代わりに、この新しいプロパティを再合成する必要があります。スーパークラスのメソッドが同じデリゲートプロパティにアクセスできないため、そこには行きたくありません。

質問
追加された型情報を使用して、具象サブクラスのプロパティを「再宣言」する方法はありますか?それとも、私の考えの誤りを見つけることができますか?これは、私が今まで遭遇したことのないかなり一般的な問題である可能性がありますか?

乾杯、
EP。

PSこの作品に登場するすべてのクラス名とプロトコル名は架空のものです。オープンソースまたは特許取得済みの実際のクラス名およびプロトコル名との類似点は、まったくの偶然です。

4

2 に答える 2

11

警告はすでに正しい手がかりを与えました。オーバーライドするサブクラスで@dynamicを使用しましたが、すべて問題ありません。

于 2011-05-07T11:20:11.513 に答える
2

で合成id<ConcreteRequestDelegate>delegateする だけでConcreteRequest.mうまくいきます...問題はありません。

于 2011-05-05T10:35:06.247 に答える