2

我创建了一个协议方法,我想在多个类中实现协议方法

@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

您可以为您的协议方法定义全局实现的一种方法(如果我正确理解您的要求)是在 NSObject 上定义一个类别:

@implementation NSObject (XMLProtocol)

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

通过这样做,每个对象都将具有该方法。不知道这是否明智,但这是一种方式。

另一种方法是定义一个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

您必须在两个类中编写方法的实现,即使实现相同。

于 2012-10-22T09:25:48.720 回答
0

在您的特殊情况下,通知将对您有很大的帮助。通知的工作方式与协议相同,只是它广播消息。这样您就可以在多个课程中收到该电话。

如果您想使用协议来完成,这也很容易。只需确保您当前的视图控制器被委托引用(即 obj.delegate = self)。您可以在 -viewWillAppear 上实现它。所以你当前的视图控制器只会被那个方法调用。委托一次只会在一个地方调用一种方法。

于 2012-10-22T09:27:57.817 回答
0

恕我直言,对于像 XML 解析这样特定的东西,全局协议并不是很好的设计。

A@protocol本身没有任何实现部分。它只是一个 API 定义,可以将其视为合同。任何符合协议的类都必须实现其强制方法和属性(有一个@optional子句)。

例如,您可能有两种 XML 解析器实现,一种适用于 iOS 4,另一种适用于 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 回答