用(Objective-C中的@protocol
语法)声明的协议用于声明类"采用"(声明它将使用此协议)将实现的一组方法.这意味着您可以在代码中指定,"只要它实现了特定的协议,您就不在乎使用哪个类".这可以在Objective-C中实现,如下所示:
id<MyProtocol> instanceOfClassThatImplementsMyProtocol;
如果您在代码中声明了这一点,那么任何"符合"协议MyProtocol的类都可以在变量instanceOfClassThatImplementsMyProtocol中使用.这意味着使用这个变量的代码知道,它可以使用MyProtocol中定义的任何方法来处理这个特定变量,而不管它是什么类.这是避免继承设计模式的好方法,并且避免了紧密耦合.
代表使用协议的语言功能.delegation design pattern是一种设计代码以在必要时使用协议的方法.在Cocoa框架中,委托设计模式用于指定符合特定协议的类的实例.这个特定的协议指定了委托类应该实现的方法,以便在给定的事件中执行特定的操作.使用委托的类知道其委托与协议共同形成,因此它知道可以在给定时间调用实现的方法.这种设计模式是解耦类的一种很好的方式,因为它使从一个委托实例交换到另一个委托实例变得非常容易——程序员所要做的就是确保替换实例或类符合必要的协议(即,它实现协议中指定的方法)!
协议和委托不仅限于Objective-C和Mac/iOS开发,Objective-C语言和Apple框架也大量使用了这种令人敬畏的语言功能和设计模式.
Edit:
这里有一个例子.在Cocoa Touch的UIKit框架中,有一个UITextFieldDelegate协议.该协议定义了一系列方法,作为UITextField实例的代理的类应该实现这些方法.换句话说,如果要将委托分配给UITextField(使用delegate
属性),最好确保该类符合UITextFieldDelegate.实际上,因为UITextField的委托属性定义为:
@property(nonatomic, weak) id<UITextFieldDelegate> delegate
然后,如果您为编译器分配了一个不实现该协议的类,编译器将发出警告.这真的很有用.你必须声明一个类实现了一个协议,如果说它实现了,你就是在让其他类知道它们可以以特定的方式与你的类交互.因此,如果您将MyTextFieldDelegateClass的一个实例分配给UITextField的delegate
属性,UITextField knows可以调用MyTextFieldDelegateClass的一些特定方法(与文本输入、 Select 等相关).它之所以知道这一点,是因为MyTextFieldDelegateClass表示将实施UITextFieldDelegate协议.
最终,这一切都会在项目代码中带来更大的灵活性和适应性,我相信在使用这项技术后,您很快就会意识到这一点!:)