如何将方法添加到Cocoa中的现有协议?
问题描述:
我想扩展或添加另一种方法到现有的协议。虽然协议特别不重要,但这正是我想要做的。如何将方法添加到Cocoa中的现有协议?
@protocol NSMatrixDelegate
- (void)myNewMethod:(id)sender;
@end
编译器警告我有相同协议的重复声明。我将如何正确地做到这一点?
谢谢。
答
您无法为协议定义类别。有两种方法解决此问题:
- 使用新的正式协议
- 使用一个非正式的协议和运行时检查
正式协议
定义一个新的正式协议是这样的:
@protocol MyCustomMatrixDelegate <NSMatrixDelegate>
- (void) myNewMethod:(id)sender;
@end
然后你会让你的自定义类符合t o <MyCustomMatrixDelegate>
而不是<NSMatrixDelegate>
。如果你使用这种方法,有一点需要注意:[self delegate]
可能会被宣布为id<NSMatrixDelegate>
。这意味着你不能做[[self delegate] myNewMethod:obj]
,因为<NSMatrixDelegate>
没有声明myNewMethod:
方法。
解决方法是通过铸造重新输入delegate
对象。也许是这样的:
- (id<MyCustomMatrixDelegate>) customDelegate {
return (id<MyCustomMatrixDelegate>)[self delegate];
}
(但是,你可能想要做某种类型的先检查,如:
if ([[self delegate] conformsToProtocol:@protocol(MyCustomMatrixDelegate)]) {
return (id<MyCustomMatrixDelegate>)[self delegate];
}
return nil;
)
然后,你会怎么做:
[[self customDelegate] myNewMethod:obj];
非正式协议
这真是一个类别一个奇特的名字上NSObject
:
@interface NSObject (MyCustomMatrixDelegate)
- (void) myNewMethod:(id)sender;
@end
那你就是不落实的方法。在你的班级发送该方法,你会这样做:
if ([[self delegate] respondsToSelector:@selector(myNewMethod:)]) {
[[self delegate] myNewMethod:someSenderValue];
}
我试过了正式协议方法。它可以工作,但编译器会警告在协议中找不到自定义方法。我将正式协议添加到委托的接口,并将委托的头包含在我将委托消息发送到的objet的实现文件中。你知道它为什么还在抱怨吗?谢谢 – David 2011-01-08 20:31:41