有很多关于Protocols&网络上的学员和不同的教程用不同的名字称呼这个过程中的一些"参与者"。
特别令人困惑的是"适应者"one_answers"一致者"的概念。
我知道实现Protocol方法的类(即其中包含<ProtocolName>
语句的类)是"Conforming to Protocol"。它也是议定书的"采用者"吗?
如何调用在中声明或在中重新声明协议的类,以便它可以包含必须符合协议的属性,即在其接口中具有@protocol ProtocolName
语句?
我找不到任何苹果官方文档来解释这一点。
编辑
伙计们,谢谢你们给出的具体答案,但我确实(而且确实)理解这个模式以及它是如何在语言中实现的。我的问题过去(现在仍然)与NAMING有关。。。尽管如此,我还是找不到任何关于"声明/REDECLARES协议的类的名称(概念上)是什么"的引用。也许它没有名字,我应该把它叫做:"声明/重新声明协议的类"。也许我可以称之为"授权班"(顺便说一句,听起来不错)。。。
语义。我想说它的行动与结果。
通过采用协议(操作),您符合(结果)
协议
当谈到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
的一些方法,但如果A
是一个非常复杂的类,因此B
可能会被迫知道"太多"。
委派模式通过显式声明协议DelegateOfB
来解决这个问题,CCD_16是在定义B
的地方定义的。然后任何需要从B
接收信息的类(如A
)都声明它符合DelegateOfB
并实现相应的方法。因此CCD_ 21除了符合CCD_。
这个模式也可以用任何语言实现,但Cocoa/Cooa-Touch或大多数其他Objective-C框架都是不寻常的,因为每当出现上述问题时,90%的时间都会使用委派。
在这里,协议是一种语言功能是有帮助的。同样,这个模式理论上可以用于任何语言,甚至汇编程序:),但它对Objective-C更有用,因为你可以声明委托需要符合这个协议:
@property id<DelegateOfB> delegate;
如果编译器认为您分配了不符合DelegateOfB
的内容,它就会警告您。
在其他语言中,通常使用不同的解决方案,例如回调函数。
请参阅文章。
使用(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的委托属性被定义为:
@property(nonatomic, assign) id<UITextFieldDelegate> delegate
如果你给编译器分配了一个没有实现协议的类,编译器就会发出警告。这真的很有用。你必须声明一个类实现了一个协议,并且说它实现了,你是在让其他类知道他们可以以特定的方式与你的类交互。因此,如果将MyTextFieldDelegateClass的实例分配给UITextField中的delegate
属性,则UITextField知道它可以调用MyTextFieldDeegateClass的一些特定方法(与文本输入、选择等相关)。它知道这一点,因为MyTextFieldDelegateClass已经说过它将实现UITextFieldDelicate协议。
最终,这一切都会使您的项目代码具有更大的灵活性和适应性,我相信您在使用这项技术后很快就会意识到这一点!享受:)
这里用Objective-C苹果文档编程,它简要介绍了您正在寻找的术语,如采用&符合等。
我不太确定你在问什么。但是,您可以强制使用您的协议的类实现某个方法。
@protocol theDelegate <NSObject>
@required
-(void)doSomething;
@end