確かに微妙な違いがあります。
あなたが話しているプロトコルが1つの特定のクラスによって使用されるデリゲートである場合、たとえば、、MySpecialViewController
およびMySpecialViewControllerDelegate
、そしてあなたはそれらの両方の宣言を同じヘッダーに保持したいと思うかもしれません。たとえば、別のクラスがそのプロトコルを実装する場合、論理的にはMySpecialViewController
クラスに依存する可能性があります。したがって、追加の依存関係を導入することはありません。
しかし、(少なくとも)プロトコルを使用するもう1つの重要な理由があります。2つのクラス間の双方向の依存関係を切り離そうとしている可能性があります。もちろん、コンパイラーは2つのヘッダーを#import
相互に許可しません。#import
ただし、1つのクラスを.mファイルに移動した場合でも、2つのクラスが互いの完全なAPIを完全に認識していることは、設計が不十分であることを示していることがよくあります。
この関係を少し切り離す1つの方法は、一方のクラスに、もう一方が実装するプロトコルを介してのみ他方を認識させることです。おそらく、クラスParent
を所有および作成するため、する必要があります。ただし、のメソッドも呼び出す必要があります。あなたは:を作ることができますChild
#import "Child.h"
Child
foo:bar:
Parent
FooProtocol
@protocol FooProtocol
- (void) foo: (int) arg1 bar: (BOOL) arg2;
@end
そして、Parent.hで:
@interface Parent : SomeBaseClass<FooProtocol> {
}
これChild
を行うことができます:
@interface Child {
}
@property (assign) id<FooProtocol> fooHandler;
そしてそれを使用します
[fooHandler foo: 1 bar: YES];
Parent
これにより、子はクラス(またはParent.h)に直接依存しなくなります。FooProtocol
ただし、これは、Parent.hではなくFooProtocol.hでの宣言を保持する場合にのみ機能します。繰り返しになりますが、これFooProtocol
がによってのみ使用されたChild
場合は、Child.hに保持することは理にかなっていますが、このプロトコルが。以外のクラスによって使用された場合はおそらくそうではありませんChild
。
したがって、要約すると、クラス間の相互依存性を分離する最大の能力を維持したい場合、または設計でより良い分離を促進したい場合は、プロトコルを別々のヘッダーに保持してください。