java - Java接口(interface)和Objective-C协议(protocol)的区

我知道 Java,现在我正在学习 Objective-C。 Java接口(interface)和Objective-C协议(protocol)到底有什么区别?

最佳答案

首先,一点点historical perspective on the topic ,来自 Java 的创建者之一。接下来,维基百科有一个中等帮助的 section on Objective-C protocols .尤其要了解 Objective-C 支持 正式协议(protocol)(使用 @protocol 关键字显式声明,相当于 Java 接口(interface))和 非正式协议(protocol)(一个类实现的一个或多个方法,可以通过反射发现)。

如果您采用正式协议(protocol)(Objective-C 术语“实现接口(interface)”),编译器将对未实现的方法发出警告,就像您在 Java 中所期望的那样。 与 Java 不同(如 skaffman 所述),如果一个 Objective-C 类实现了正式协议(protocol)中包含的方法,那么即使它的接口(interface)不符合该协议(protocol),也可以说它“符合”该协议(protocol)。 t 明确采用它。 您可以在代码中测试协议(protocol)一致性(使用 -conformsToProtocol:),如下所示:

if ([myObject conformsToProtocol:@protocol(MyProtocol)]) {
    ...
}

注意:Apple 的 documentation状态:

"This method determines conformance solely on the basis of the formal declarations in header files, as illustrated above. It doesn’t check to see whether the methods declared in the protocol are actually implemented—that’s the programmer’s responsibility."

从 Objective-C 2.0(在 OS X 10.5“Leopard”和 iOS 中)开始,正式协议(protocol)现在可以定义可选方法,并且一个类只要实现所有所需的方法。您可以使用 @required(默认)和 @optional 关键字来切换是否遵循 mustma​​y的方法声明strong> 被实现以符合协议(protocol)。 (参见 Apple 的 Objective-C 2.0 Programming Language 指南中讨论 optional protocol methods 的部分。)

可选的协议(protocol)方法为开发人员提供了很大的灵 active ,特别是对于实现委托(delegate)监听器。而不是扩展像 MouseInputAdapter 这样的东西(这可能很烦人,因为 Java 也是单继承)或实现许多无意义的空方法,您可以采用协议(protocol)并仅实现您关心的可选方法。使用这种模式,调用者在调用它之前检查该方法是否已实现(使用 -respondsToSelector ),如下所示:

if ([myObject respondsToSelector:@selector(fillArray:withObject:)]) {
    [myObject fillArray:anArray withObject:foo];
    ...
}

如果反射的开销成为问题,您可以随时cache the boolean result for reuse ,但要抵制过早优化的冲动。 :-)

关于java - Java接口(interface)和Objective-C协议(protocol)的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/990360/

相关文章:

ios - UICollectionView 的 cellForItemAtIndexPath 没有

objective-c - BOOL 的默认值

ios - NSDictionary - 需要检查字典是否包含键值对

objective-c - 从 NSSet 中获取对象

objective-c - 如何摆脱 Xcode 中的 "unused variable"警告?

ios - 无法在模拟器中运行应用程序 : An error was encountered whi

objective-c - 以编程方式在 UINavigationController 中设置 UI

ios - 如何删除 UIWebView 的所有 cookie?

objective-c - 有没有办法强制在 NSArray、NSMutableArray 等上输入

iphone - Objective-C 将十六进制字符串解析为整数