谁能解释一下之间的区别 协议类别 在 Objective-C 中?你什么时候使用其中一种而不是另一种?

有帮助吗?

解决方案

一个协议是同样的事情,在Java中的接口:它本质上是一个合同,说,请“的任何类实现该协议也将实现这些方法。”

一个类别中,在另一方面,只是结合方法的一类。例如,在可可,我可以创建NSObject,让我的方法添加到NSObject类(当然,所有的子类)类别,即使我不真的有机会获得NSObject 的。

要总结的协议规定了什么方法的类将实现;类别添加方法,以现有的类。

在正确使用各个的话,应该是清楚的:使用协议声明一组的一个类必须实现的方法,并使用类别来的方法添加到现有的类

其他提示

有一个协议说,“这里有一些方法,我想的的实施。”一个类别说,“我正在扩展此类与这些额外的方法的功能性。”

现在,我怀疑你的困惑来自苹果使用短语“非正式协议”的茎。这是关键(和最令人困惑的)点:一个非正式的协议,其实并不是一个协议的。它实际上是在NSObject的一个类别。可可采用非正式的协议普遍地为代表提供的接口。由于@protocol语法没有允许可选的方法,直到Objective-C的2.0,苹果实现了可选的方法什么都不做(或返回一个虚拟值)和所需的方法抛出异常。没有办法通过编译为执行本

现在,用Objective-C的2.0时,@protocol句法支持@optional关键字,标志着一个协议的一些方法作为可选的。因此,你的类遵循的协议,只要它实现了所有标记为@required方法。编译器可以判断你的类是否实现了所有必需的方法也一样,这是一个巨大的节省时间。在iPhone SDK只使用Objective-C的2.0 @protocol语法,我不能想到一个很好的理由不以任何新的开发中使用它(除了Mac OS X的Cocoa程序需要在早期版本的Mac OS X上运行)。

类别:

类别是一种向现有类的所有实例添加新方法而不修改类本身的方法。

当您想要向现有类添加功能而不从该类派生或重写原始类时,可以使用类别。

假设您正在使用 NSView 可可中的物体,你发现自己希望所有的实例 NSView 能够执行某些操作。显然,你不能重写 NSView 类,即使你从它派生,也不是所有的 NSView 程序中的对象将属于您的派生类型。解决方案是创建一个类别 NSView, ,然后您可以在程序中使用它。只要你 #import 包含您的类别声明的头文件,它看起来就像 每一个 NSView 对象响应您在类别源文件中定义的方法。

协议:

协议是任何类都可以选择实现的方法的集合。

当您想要保证某个类将响应一组特定的方法时,您可以使用协议。当一个类采用协议时,它承诺实现协议头中声明的所有方法。这意味着使用该类的任何其他类都可以确定这些方法将被实现,而无需了解有关该类的任何其他信息。

当创建一系列相似的类并且都需要与公共“控制器”类进行通信时,这非常有用。控制器类和受控类之间的通信都可以打包到单个协议中。

边注:Objective-C 语言不支持多重继承(一个类只能从一个超类派生),但许多相同的功能可以通过协议提供,因为一个类可以符合多个不同的协议。

要我的理解协议是有点像Java的接口。协议声明的方法,但是执行是由每个班级。分类似乎有什么东西像Ruby的混入。随着分类,你可以添加方法,以现有的类。甚至内置类。

一个协议可声明的,其并不局限于任何特定种类或类别的方法的列表。在该协议中声明的方法,可以采用任何类/类别。其采用协议A类或类别必须实现所有的协议声明所需的方法。

一个类别,您可以添加额外的方法,以现有的类,但他们不允许额外的实例变量。该方法的类增加了成为类类型的一部分。

协议是合同实现指定的方法。符合的协议的任何对象同意提供用于这些方法的实现。良好的使用的协议是定义的一组回调方法对于一个委托(其中委托必须以所有方法响应)。

分类提供通过添加方法它(类或实例的方法),以延长一个当前对象的能力。一个很好的用途为一个类别将是延伸NSString类添加功能,这是以前没有的,如添加方法来创建所述接收器转换为1337的新字符串5P34K。

NSString *test = @"Leet speak";
NSString *leet = [test stringByConvertingToLeet];

这S.G.Kochan的定义 “编程在Objective-C”:

<强>分类

一个类别为您提供了一个模块化类的定义成组或相关方法的类别的简单方法。它也给你一种简单的方法,甚至无需访问该类的原始源代码和无需创建子类来扩展现有的类定义。

<强>协议

一个协议是被类之间共享方法的列表。在协议中列出的方法不具有相应实现;他们注定要由别人来实现(像你这样的!)。的协议提供了一种方法以定义的一组以某种方式与指定的名称相关的方法。该方法通常记录,让你知道他们将如何执行,因此,你可以在自己的类定义实现它们,如果需要的话。 的协议列表中的一套方法,其中一些你可以选择实现,并且您实现需要别人。如果您决定要实现所有的特定协议所要求的方法,你是说要符合或采用该协议。你被允许定义一个协议,其中所有的方法是可选的,或者一个其中所有都是必需的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top