首先,从Java的一位创建者那里对该主题进行了一些历史性的展望。接下来,维基百科在Objective-
C协议中提供了适度有用的部分。特别要了解的是,Objective-
C支持 正式协议 (使用
@protocol关键字明确声明,相当于Java接口)和 非正式协议
(仅一个或多个由类实现的方法,可以通过反射来发现)。
如果您采用正式协议(“实现接口”的Objective-C术语),则编译器将针对未实现的方法发出警告,就像您在Java中所期望的那样。 与Java不同(如skaffman所述),如果Objective-C类实现了正式协议中包含的方法,则即使它的接口未明确采用它,也可以说它“符合”该协议。您可以在代码中测试协议一致性(使用-conformsToProtocol:),如下所示:
if ([myObject conformsToProtocol:@protocol(MyProtocol)]) { ...}注意:Apple
文档说明:
“如上所述,该方法仅根据头文件中的形式声明来确定一致性。它不检查协议中声明的方法是否被实际实现,这是程序员的责任。”
从Objective-C 2.0(在OS X 10.5“ Leopard”和iOS中)开始,正式协议现在可以定义 可选方法
,并且一个类只要实现所有必需的方法,就符合该协议。您可以使用
@required(默认)和
@optional关键字来切换是否 必须 或
可以 将后面的方法声明实现为符合协议。(请参阅Apple的Objective-C
2.0编程语言指南,该节讨论了可选的协议方法。)
可选的协议方法为开发人员提供了很大的灵活性,特别是对于实现 委托 和 侦听器
。您可以采用协议并仅实现您关心的可选方法,而不是扩展诸如MouseInputAdapter之类的东西(由于Java也是单继承性,这可能会很烦人),或者实现许多毫无意义的空方法。使用这种模式,调用方会在调用该方法之前检查该方法是否已实现(使用-respondsToSelector),如下所示:
if ([myObject respondsToSelector:@selector(fillArray:withObject:)]) { [myObject fillArray:anArray withObject:foo]; ...}如果反射的开销成为问题,则始终可以缓存布尔结果以供重用,但可以避免过早优化的冲动。:-)



