Objective-C協議在概念和代碼方面與Java接口鬆散地相似,簡單起見。
如果將Java變量聲明爲接口類型,則表示它可以接受任何實現該接口的對象。在Objective-C中,id
變量表示任何指針類型,所以id<MyProtocol>
意味着指向採用MyProtocol
的對象的任何指針,並且在此意義上類似於Java接口類型聲明。
在Java中,您在類中實現接口方法,並聲明該類來實現接口。同樣的,在Objective-C中,你需要在一個類中實現一個協議方法,並讓該類採用該協議。
這裏的Java和Objective-C之間的代碼比較(同樣它的兩個相似的概念,只是一個鬆散的比較):
的Java
public interface MyInterface {
void someMethod();
}
public class MyClass implements MyInterface {
public void someMethod() {
System.out.println("Some method was called");
}
}
public class Main {
public static void main(String[] args) {
// Any class that implements MyInterface can be
// assigned to this variable
MyInterface someVar = new MyClass();
someVar.someMethod();
}
}
Objective-C的
@protocol MyProtocol <NSObject>
- (void)someMessage;
@end
@interface MyClass : NSObject <MyProtocol>
- (void)someMessage;
@end
@implementation MyClass
- (void)someMessage {
NSLog(@"Some message was sent");
}
@end
int main(int argc, const char *argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Any class that adopts MyProtocol can be
// assigned to this variable
id<MyProtocol> someVar = [[MyClass alloc] init];
[someVar someMessage];
[someVar release];
[pool drain];
return 0;
}
協議是您在Java中稱爲'接口'的協議:)對於其餘部分,Mark提供了正確的答案。 – Phlibbo