5

protocol同じクラスで a を宣言するときと別のファイルで宣言するときの違いは何ですか。例 :

#import <UIKit/UIKit.h>

@class MyClassA;

@protocol MyDelegate <NSObject>

@required
- (MyClassA*)myMythod;

@optional
- (void)anOtherMethod:(NSString*)ID;

@end

@interface MyClassB : UIViewController <UITableViewDataSource, UITableViewDelegate>

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

ここでは、MyClassB と同じファイルでプロトコル デリゲートを宣言します。別のソース ファイルでそれ (プロトコル デリゲート) を宣言できます。クラスと同じファイルで宣言する場合と別のファイルで宣言する場合の違いは何ですか? ありがとう!

4

3 に答える 3

8

確かに微妙な違いがあります。

あなたが話しているプロトコルが1つの特定のクラスによって使用されるデリゲートである場合、たとえば、、MySpecialViewControllerおよびMySpecialViewControllerDelegate、そしてあなたはそれらの両方の宣言を同じヘッダーに保持したいと思うかもしれません。たとえば、別のクラスがそのプロトコルを実装する場合、論理的にはMySpecialViewControllerクラスに依存する可能性があります。したがって、追加の依存関係を導入することはありません。

しかし、(少なくとも)プロトコルを使用するもう1つの重要な理由があります。2つのクラス間の双方向の依存関係を切り離そうとしている可能性があります。もちろん、コンパイラーは2つのヘッダーを#import相互に許可しません。#importただし、1つのクラスを.mファイルに移動した場合でも、2つのクラスが互いの完全なAPIを完全に認識していることは、設計が不十分であることを示していることがよくあります。

この関係を少し切り離す1つの方法は、一方のクラスに、もう一方が実装するプロトコルを介してのみ他方を認識させることです。おそらく、クラスParentを所有および作成するため、する必要があります。ただし、のメソッドも呼び出す必要があります。あなたは:を作ることができますChild#import "Child.h"Childfoo:bar:ParentFooProtocol

@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

したがって、要約すると、クラス間の相互依存性を分離する最大の能力を維持したい場合、または設計でより良い分離を促進したい場合は、プロトコルを別々のヘッダーに保持してください

于 2012-07-08T10:28:06.417 に答える
1

変わりはない。ヘッダーをどのように整理するかが問題になります。

たとえば、「1つの機能エンティティ」に関連するすべてのもの(つまり、定義は異なります:-))を1つのファイルに保存するのが好きです。したがって、プロトコルを実装するデリゲートを使用しているクラスは、クラスとプロトコルを同じヘッダーで宣言します。これは、これらが同じ建物のまったく異なるブリックであるためです。

于 2012-07-08T09:32:04.527 に答える
0

プロトコルをクラスのヘッダーファイルとは別のヘッダーファイルに含めることの唯一の違いは、プロトコルをオプションで含めることができることです。これは、名前の衝突を解決するのに役立ちますが、プロトコルのプレフィックスを付けることがその解決策になるはずです。

慣例では、関連するプロトコルをクラスのヘッダーファイル内に含めるように見えます。これにより、プロトコルがより整理されてまとめられますが、プロトコルが非常に大きい場合は、クラスヘッダーを作成するために、それらを別々のファイルに含める方が理にかなっている場合があります。読みやすい。

于 2012-07-08T09:35:16.773 に答える