6
我想擴展或添加另一種方法到現有的協議。雖然協議特別不重要,但這正是我想要做的。如何將方法添加到Cocoa中的現有協議?
@protocol NSMatrixDelegate
- (void)myNewMethod:(id)sender;
@end
編譯器警告我有相同協議的重複聲明。我將如何正確地做到這一點?
謝謝。
我想擴展或添加另一種方法到現有的協議。雖然協議特別不重要,但這正是我想要做的。如何將方法添加到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