1

网上有很多关于 Protocols & Delegates 的资料,不同的教程用不同的名字称呼这个过程中的一些“参与者”。

特别令人困惑的是“Adaptor”和“Conformer”的概念。

我了解实现协议方法的类 - 即其中包含<ProtocolName>声明的类 - 是“符合协议”。它也是协议的“采用者”吗?

如何调用在其中声明或重新声明协议的类,以便它可以包含必须符合协议的属性 - 即在其接口中具有@protocol ProtocolName声明?

我找不到任何解释这一点的 Apple 官方文档。

编辑

伙计们,感谢指定的答案,但我确实(并且确实)理解了这种模式以及它是如何在语言中实现的。我的问题是(并且仍然是)与 NAMING 相关......而且,我仍然找不到任何关于“声明/重新声明协议的类的名称(概念上)是什么”的参考。也许它没有名字,我应该称之为:“声明/重新声明协议的类”。也许我可以称它为“委托类”(顺便说一句,这听起来不错)......

4

5 回答 5

3

语义。我会说它的行动与结果。

通过采用协议(操作),您就符合它(结果)

于 2013-11-27T10:24:45.387 回答
2

参考帖子

使用( Objective-C 中的语法)声明的协议@protocol用于声明“采用”(声明它将使用此协议)的类将实现的一组方法。这意味着您可以在代码中指定“只要它实现特定协议,您就不会关心使用哪个类”。这可以在 Objective-C 中完成,如下所示:

id<MyProtocol> instanceOfClassThatImplementsMyProtocol;

如果您在代码中声明了这一点,那么任何“符合”协议 MyProtocol 的类都可以在变量instanceOfClassThatImplementsMyProtocol中使用。这意味着使用这个变量的代码知道它可以使用 MyProtocol 中定义的任何方法和这个特定的变量,不管它是什么类。这是避免继承设计模式和避免紧耦合的好方法。

委托是对协议语言特性的一种使用。委托设计模式是一种设计代码以在必要时使用协议的方法。在 Cocoa 框架中,委托设计模式用于指定符合特定协议的类的实例。这个特定的协议指定了委托类应该实现的方法,以在给定的事件中执行特定的操作。使用委托的类知道它的委托符合协议,因此它知道它可以在给定的时间调用实现的方法。这种设计模式是一种解耦类的好方法,因为它使得将一个委托实例交换为另一个委托实例变得非常容易——程序员所要做的就是确保替换实例或类符合必要的协议(即它实现了协议中指定的方法)!

协议和委托不仅限于 Objective-C 和 Mac/iOS 开发,而且 Objective-C 语言和 Apple 框架大量使用了这种令人敬畏的语言特性和设计模式。

这是一个例子。在Cocoa Touch 的UIKit 框架中,有一个UITextFieldDelegate协议。该协议定义了作为UITextField实例的委托的类应该实现的一系列方法。换句话说,如果你想将一个委托分配给一个UITextField(使用委托属性),你最好确保这个类符合UITextFieldDelegate。其实是因为 UITextField 的 delegate 属性定义为:

@property(nonatomic, assign) id<UITextFieldDelegate> delegate

然后,如果您为其分配一个未实现协议的类,编译器将发出警告。这真的很有用。你必须声明一个类实现了一个协议,并且说它实现了,你让其他类知道他们可以以特定的方式与你的类交互。因此,如果您将MyTextFieldDelegateClass的实例分配给UITextFielddelegate属性,则UITextField知道它可以调用您的MyTextFieldDelegateClass的某些特定方法(与文本输入、选择等相关) 。它知道这一点,因为MyTextFieldDelegateClass已经说过它将实现UITextFieldDelegate协议。

最终,这一切都会为您的项目代码带来更大的灵活性和适应性,我相信您在使用这项技术后很快就会意识到这一点!享受 :)

于 2013-11-27T10:24:22.857 回答
2

协议

在谈到Objective-C时,协议是Objective-C语言的一个概念,因此是编译器可以理解的。具体来说,您可以通过@protocol关键字来定义它。

一个类可以用角度语法声明自己符合协议:

 @interface MyClass <MyProtocol> // class MyClass conforms to protocol MyProtocol

有些人在这里使用了“采用”这个词例如“类MyClass采用协议MyProtocol”。

Objective-C 编译器将理解此语法,例如,如果其中有所需的方法MyProtocol未在MyClass.

模式

(编程设计)模式是可以用任何(图灵完备)语言实现的抽象概念您编写特定于语言的代码,然后这种模式告诉人类。编译器将不知道您是否将代码称为一些花哨的词。

适配器是一种特定的模式。同样,它可以与任何编程语言一起使用,尽管某些语言(例如 Python)通过声明使这变得更容易。

我不知道Conformer的概念。

代表们

委托委托模式的一部分。它用于解决对象A想要对对象做某事B然后希望B能够与之交谈的问题A。为了使这种对话成为可能B,需要了解一些关于方法的信息A,但是 ifA是一个非常复杂的类,因此B可能被迫了解“太多”。

委托模式通过显式声明一个协议来解决这个问题DelegateOfB,定义在哪里B定义。然后任何需要从B(例如A)接收信息的类声明它符合DelegateOfB并实现相应的方法。因此,B除了A符合DelegateOfB.

这种模式也可以用任何语言实现,但是 Cocoa/Cocoa Touch 或大多数其他 Objective-C 框架是不寻常的,因为每当出现上述问题时,90% 的时间都使用委托。

在这里,协议是一种语言特性会有所帮助。同样,这种模式理论上可以在任何语言中使用,甚至是汇编程序 :),但它对 Objective-C 会更有用,因为您可以声明委托需要遵守此协议:

@property id<DelegateOfB> delegate;

如果编译器认为您分配的内容不符合DelegateOfB.

在其他语言中,通常使用不同的解决方案,例如回调函数。

于 2013-11-27T10:18:21.377 回答
0

我不太确定你在问什么。但是您可以强制使用您的协议的类实现某个方法。

@protocol theDelegate <NSObject>

@required
-(void)doSomething;
@end
于 2013-11-27T10:23:45.380 回答
0

在这里Programming With Objective-C apple doc,简要说明了您正在寻找的术语,例如采用和符合等。

于 2013-11-27T10:15:58.930 回答