2

1 つのプロトコル メソッドを作成し、そのプロトコル メソッドを複数のクラスに実装したい

@protocol XMLProtocol <NSObject>

- (BOOL) hasAllRequiredAttributes :(NSDictionary*)attributeMap;

@end

私はこの次のクラスメソッドを使用しています

#import "XMLProtocol.h"
@interface MachineA : NSObject<XMLProtocol>

とその実装方法 プロトコル方式を実装します

- (BOOL) hasAllRequiredAttributes:(NSDictionary *)attributeMap {
  return false;
  }

また、このプロトコルメソッドを別のクラスで使用します

#import "XMLProtocol.h"
@interface MachineB : NSObject<XMLProtocol>

とその実装方法 プロトコル方式を実装します

- (BOOL) hasAllRequiredAttributes:(NSDictionary *)attributeMap {
  return false;
 }

私の考えは、プロトコルメソッドをどこで呼び出すべきかということです。私は完全に混乱しました。これどうやってするの。

4

4 に答える 4

3

プロトコル メソッドのグローバルな実装を定義する方法の 1 つは (あなたが求めていることを正しく理解している場合)、NSObject でカテゴリを定義することです。

@implementation NSObject (XMLProtocol)

- (BOOL) hasAllRequiredAttributes:(NSDictionary *)attributeMap {
   return false;
}

このようにすることで、すべてのオブジェクトがそのメソッドを持つようになります。これが賢明かどうかはわかりませんが、方法です。

もう 1 つの方法は、との両方が派生するMachine基本クラスを定義することです。プロトコル メソッドは基本クラスで定義されます。MachineAMachineB

@interface Machine : NSObject <XMLProtocol>
   ...
@implementation Machine
- (BOOL) hasAllRequiredAttributes:(NSDictionary *)attributeMap {
   return false;
}
    ....
@end

@interface MachineA : Machine
 ...

必要に応じて、派生クラスはそれを再定義できます。

これは NSObject カテゴリほど「グローバル」ではありませんが、そのプロトコルを実装する必要があるすべてのクラスの基本クラスを定義できる場合は、より良い解決策になる可能性があります。

于 2012-10-22T09:30:07.950 に答える
0

特定の状況では、通知は非常に役立ちます。通知は、メッセージをブロードキャストすることを除いて、プロトコルと同じように機能します。そのため、複数のクラスでその電話を受けることができます。

プロトコルを使用したい場合も、非常に簡単です。現在のView Controllerがデリゲートで参照されていることを確認してください(つまり、obj.delegate = self)。-viewWillAppear で実装できます。したがって、現在のView Controllerはそのメソッドのみが呼び出されます。デリゲートは、一度に 1 つの場所で 1 つのメソッドのみを呼び出します。

于 2012-10-22T09:27:57.817 に答える
0

実装が同一であっても、両方のクラスでメソッドの実装を記述する必要があります。

于 2012-10-22T09:25:48.720 に答える
0

IMHOグローバルプロトコルは、XML解析のような特定のものにはあまり適した設計ではありません。

A@protocol自体には実装部分がありません。これは単なる API 定義であり、コントラクトのようなものと考えてください。プロトコルに準拠するすべてのクラスは、必須のメソッドとプロパティを実装する必要があります (@optional節があります)。

たとえば、XML パーサーの 2 つの実装があり、1 つは iOS 4 で機能し、もう 1 つは iOS 5+ で機能します。XMLProtocolどちらもプロトコルに準拠していると宣言されています。そして、両方とも を実装 - (BOOL) hasAllRequiredAttributes :(NSDictionary*)attributeMap;していますが、異なる方法で実装する必要があると想像してみましょう。

準拠しているおかげでXMLProtocol、実装の詳細は気にしません。属性マップを渡し、必要な属性がすべて含まれているかどうかを示すブール値を取得することはわかっています。

これらのクラスを使用する場所でメソッドを呼び出します。

id <XMLProcotol> parser;
if (iOS4) {
    parser = [[OldXMLParser alloc] initWithString:<#...#>];
} else {
    parser = [[NewXMLParser alloc] initWithString:<#...#>];
}
/* you call the method without caring which parser class
 * has been actually created thanks to the protocol
 */
if ([parser hasAllRequiredAttributes:theMap]) {
    ...
}

メソッドの実装が同一である場合、プロトコルに存在するかどうかに関係なく、共通メソッドを実装する共通親クラスのサブクラスの両方を作成できます。

于 2012-10-22T09:44:48.907 に答える