我创建了一个协议方法,我想在多个类中实现协议方法
@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;
}
我的想法是我应该在哪里调用协议方法。我完全糊涂了。我怎么能这样做。
答案 0 :(得分:3)
您可以为协议方法定义全局实现的一种方法(如果我正确理解您的要求)是在NSObject上定义一个类别:
@implementation NSObject (XMLProtocol)
- (BOOL) hasAllRequiredAttributes:(NSDictionary *)attributeMap {
return false;
}
通过这样做每个对象都将拥有该方法。不知道这是否合情合理,但这是一种方式。
另一种方法是定义一个Machine
基类,MachineA
和MachineB
都来自这个基类;协议方法将在基类中定义:
@interface Machine : NSObject <XMLProtocol>
...
@implementation Machine
- (BOOL) hasAllRequiredAttributes:(NSDictionary *)attributeMap {
return false;
}
....
@end
@interface MachineA : Machine
...
如果需要,任何派生类都可以重新定义它。
这不像NSObject类别那样“全局”,但如果您可以为需要实现该协议的所有类定义基类,它可能是更好的解决方案。
答案 1 :(得分:0)
您必须在两个类中编写方法的实现,即使实现是相同的。
答案 2 :(得分:0)
在您特殊情况下,通知对您来说将是非常有用的帮助。除了广播消息之外,通知与协议的工作方式相同。所以你可以在多个班级接到这个电话。
如果你想完成协议,也很容易。只需确保您使用委托引用当前视图控制器(即obj.delegate = self)。你可以在-viewWillAppear上实现它。所以你当前的视图控制器只能调用该方法。代表只会在一个地方一次调用一种方法。
答案 3 :(得分:0)
恕我直言,全局协议对于像XML解析一样具体的设计并不是很好。
@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]) {
...
}
如果方法的实现相同,则可以将两个实现公共父类的子类同时存在于协议中。