8

インターフェイスとして機能する独自のヘッダー ファイルに protocolA があります。次に、そのプロトコルの異なる実装である 2 つの具象クラスがあります。

現在、私の ViewController では、これを使用して id 型のプロパティを宣言しています。これにより、VC がこれについて何も知らなくても実装を交換できます。

これら 2 つの実装オブジェクトから VC へのデリゲート呼び出しに使用される protocolB もあります。

問題は、循環依存関係があることです。

プロトコル A では、タイプ ID の「デリゲート」プロパティを宣言する必要があります。プロトコル B では、デリゲート メソッドは、型 ID のオブジェクトである呼び出し元に参照を送信しています...

より良いデザインはありますか?


例を挙げて更新してください。他の人にとって役立つかもしれません。

ProtocolA ヘッダー:

#import <Foundation/Foundation.h>

 /*!
 Abstract interface for any Provider 
 */

@protocol DataProviderDatasource <NSObject>

@required
@property (nonatomic) id <DataProviderDelegate> delegate; 
-(void)update;

@end

ProtocolB ヘッダー

#import <Foundation/Foundation.h>
#import "DataProviderDatasource.h"
/*!
 Protocol that each  Data Provider implements to make delegate calls to notify its     delegate about data management operations.
 */

@protocol DataProviderDelegate <NSObject>

-(void)dataProviderWillUpdate:(id<DataProviderDatasource>)dataProvider;
-(void)dataProviderdidUpdate:(id<DataProviderDatasource>)dataProvider;

@終わり

4

1 に答える 1

14

クラスと同様に、プロトコルを宣言できます。

@protocol MONProtocolB; // << forward declaration -- #import not required

@protocol MONProtocolA
- (void)setDensity:(NSValue<MONProtocolB>*)pValue;
                           ^^^^^^^^^^^^ << compiler recognizes this as an
                                           objc protocol
@end

次に、プロトコル名と循環依存が壊れていることを確認しても、コンパイラーはbarfしません(プロトコルが両方とも別のプロトコルから派生している場合を除きますが、これはもちろんばかげています)。

#importその後、物理的な依存関係がある場合はどこでも MONProtocolBを実行できます。

于 2012-10-09T10:28:14.570 に答える