首先是一位Java的创造者写的大约historical perspective on the topic篇文章.接下来,维基百科有一个适度有用的section on Objective-C protocols.特别是,要理解Objective-C支持formal protocols(用@protocol
关键字显式声明,相当于Java接口)和informal protocols(一个类实现的一个或多个方法,可以通过反射发现).
如果您采用正式的协议(Objective-C术语,意为"实现接口"),编译器将为未实现的方法发出警告,正如您在Java中所期望的那样与Java(如skaffman所述)不同,如果Objective-C类实现了一个正式协议中包含的方法,那么它被称为"符合"该协议,即使它的接口没有显式地采用它您可以在代码中测试协议一致性(使用-conformsToProtocol:),如下所示:
if ([myObject conformsToProtocol:@protocol(MyProtocol)]) {
...
}
注:苹果的documentation个州:
"此方法仅基于头文件中的正式声明来确定一致性,如上所示.它不判断协议中声明的方法是否实际实现,这是程序员的责任."
从Objective-C2.0(在OS X 10.5"Leopard"和iOS中)开始,正式的协议现在可以定义optional methods,一个类只要实现了所有必需的方法,就符合协议.您可以使用@required
(默认)和@optional
关键字来切换must或may之后的方法声明是否被实现以符合协议.(请参阅苹果Objective-C 2.0 Programming Language指南中讨论optional protocol methods的部分.)
可选协议方法为开发人员提供了很大的灵活性,尤其是对于实现delegates和listeners.您可以采用协议,只实现您关心的可选方法,而不是扩展MouseInputAdapter(这可能很烦人,因为Java也是单继承)之类的东西,或者实现许多无意义的空方法.使用此模式,调用方在调用该方法(使用-respondsToSelector)之前判断该方法是否已实现,如下所示:
if ([myObject respondsToSelector:@selector(fillArray:withObject:)]) {
[myObject fillArray:anArray withObject:foo];
...
}
如果反射的开销成为一个问题,你总是可以 Select cache the boolean result for reuse,但要抵制过早优化的冲动.:-)