Objective-C接口、委托和协议

6

我正在努力理解Objective-C接口、代理和协议。

我的问题是:

代理必须在一个单独的文件中吗?还是可以在你的类中定义方法作为代理?

协议是否像Java中的接口?目前我理解的是,如果你使用这个协议,它基本上会让你实现一些方法。

我仍然对接口感到困惑。我很确定它们与Java中的接口没有任何相似之处。也许它只是声明将在类中实现的变量。

3个回答

22

需要定义一个委托协议,如下所示

@protocol 
//methods
@end

它可以放在任何.h类中,只需在使用前导入即可。

协议不像Java接口,协议是一种适配器,允许两个类一起工作。基本上,它表示,如果您希望A类向您发送有关其状态和操作的消息,则必须实现其委托将调用的方法。它不像接口,因为接口说如果您想派生此类,则必须实现这些方法,而协议则表示如果您想与此类交互,则必须实现这些方法,因此有所不同。


+1 对接口和协议之间差异的精彩描述。 - D.Shawley
当你说它不像一个接口时,你的意思是它不像Objective-C的接口。但如果我没记错的话,Objective-C协议类似于Java接口。 - Olivier 'Ölbaum' Scherler
@Olivier'Ölbaum'Scherler 不是的,它们更像是适配器。Java中的接口不是适配器。尽管您可以在Java中使用接口来实现类似于Objective-C协议的目的。 - Daniel

13
  • 代理的作用是在另一个对象执行某些操作时通知它。例如,您的一个对象想知道一个窗口正在关闭,因此您将其注册为窗口的代理并实现windowWillClose:方法。这个方法会被NSWindow适当地调用。因此,代理方法通常定义在另一个类中。在某种程度上,它可以让您扩展一个类的功能而不必对它进行子类化。

  • (编辑:请参见Daniel的关于协议的回答)

  • @interface是类声明,其中列出了成员变量和方法。它位于.h文件中,如果需要使用该类,则需要导入该文件。方法的代码位于@implementation中的.m文件中。在Java中,情况有所不同,.java文件同时承担这两个目的。


2
我建议查看以下内容: Objective-C 2.0编程语言,它应该能回答你大部分关于协议和接口的问题。 协议 接口 至于代理,它们可以是一个新对象或者你正在创建需要代理的对象。文件与此无关。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接