Протоколы 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();
}
}
Объективно-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;
}