类和协议之间的区别是什么

时间:2011-12-13 16:14:50

标签: objective-c ios class protocols

我正在浏览文档,因为我即将实现一个协议而不是一个类(我之前从未做过的事情),而且我很好奇两者之间的区别。

有人可以用简单的词语举个例子吗?

由于

6 个答案:

答案 0 :(得分:12)

用作基于该类的特定实现创建一个或多个对象的蓝图。 一个很好的类比是切割黄油饼干的形式。表单的属性(形状,大小,高度)定义了可以用它剪切的cookie。您只有一个表单(类),但您可以使用它创建许多cookie(该类的实例,即对象)。所有Cookie均基于该特定表单。 类似地,属于该类实例的所有对象的属性都相同。

Classes = 数据方法(特殊功能),所有这些都精巧地捆绑在一起。

课程定义,他们的内部内容(数据)是什么+他们可以做什么样的工作(方法)。 内容基于包含各种数字类型,字符串,常量和其他更复杂的内容+方法的变量,这些内容+方法是(当执行时)对各种数据执行某些计算操作的代码块。

课程中定义的所有方法都有 定义 - 定义方法的名称+方法处理所需的数据(如果有)以及方法吐出以供其他人处理的数据(如果有)。在类中定义的所有方法也有实现 - 提供处理的实际代码 - 它是方法的内部工作..内部有代码处理数据,并且还能够询问其他方法子处理数据。因此,课程是一种非常高贵的编程类型。

如果您了解上述内容,您将了解协议是什么。

协议是一组一个或多个方法声明,该集合具有名称并代表协议。我说声明,因为一起由特定协议定义的方法,没有定义任何实现代码。。唯一存在的是他们宣布的名字。 看看上面 - 在课堂上,你不仅要定义这个类有哪些方法,还要定义如何完成这项工作。但协议中的方法没有任何实现。

让我们再次进行真实的比喻,这会有所帮助。如果你来我家住这里一个星期,你需要遵守我的TidyUp协议。 TidyUp协议定义了三种方法 - 每天洗碗,打扫房间,呼吸新鲜空气。这三种方法,我定义它们......你会做的事情。但是我绝对不在乎,实现应该是什么样子,我只是定义了方法。您将实现它们,即您定义该工作的细节(这些方法)将如何。我只是说,坚持我的协议并按照你的意愿实施它。

结局 - 您可以申报一些课程。您也可以单独声明协议。然后你可以声明,除了自己的方法之外,这个类将采用或遵守该协议,即。该课程将实施协议的方法。

答案 1 :(得分:2)

协议很像Java和其他语言的接口。可以将其视为描述其他类同意实现的接口的合同。它可以定义实现类将实现的必需和可选方法的列表。与类不同,它不提供自己的那些方法的实现。

答案 2 :(得分:2)

来自The Objective-C Programming Language的简单词语简单地解释了协议的目的:

  

协议声明可以由任何类实现的方法。   协议在至少三种情况下都很有用:

     
      
  • 声明其他人应该实施的方法
  •   
  • 在隐藏类的同时声明对象的接口
  •   
  • 捕捉非等级相关的类之间的相似性
  •   

因此,协议声明方法,但不提供实现。采用协议的类应该实现协议的方法。

委托是协议有用的一个很好的例子。例如,考虑UITableViewDataSource协议。任何类都可以采用该协议,任何这样做的类都可以用作表的数据源。表视图不关心什么类型的对象充当其数据源;它只关心充当数据源的对象实现一组特定的方法。您可以为此使用继承,但是所有数据源对象都必须从公共基类派生(比NSObject更具体)。相反,使用该协议可以使表格能够调用-tableView:willBeginEditingRowAtIndexPath:-tableView:heightForRowAtIndexPath:等方法,而无需了解有关数据源的任何其他信息。

答案 3 :(得分:1)

类和协议之间的主要区别在于编写协议对于实现委托方法很有用。

在示例中我们有A类和B类,我们想要从B类调用A类中的方法。

你可以在本文中阅读一个非常有价值的例子

http://iosdevelopertips.com/objective-c/the-basics-of-protocols-and-delegates.html

阅读代码胜过千言万语; - )

在我第一次使用'em

时,这帮助了我

答案 4 :(得分:1)

与其他语言相比差别小。接口(相当于Java / C ++类)定义对象的数据布局,并可定义其方法的某些子集(当然,包括定义整个集合的可能性)。协议仅定义方法的子集,没有数据定义。

重要的是,接口只能从一个其他接口继承(当然,它可以继承自继承自...的接口的接口),但接口可以实现任意数量的协议。因此,没有公共继承的两个不同的接口(除了NSObject之外)都可以实现相同的协议,从而“证明”它们提供相同的功能。 (虽然使用Objective-C,您可以通过一些技巧调用接口声明或协议中未外部声明的接口方法,因此协议在某种程度上只是“语法糖”或其他一些。)

答案 5 :(得分:0)

协议定义了一个类可以做什么,比如Java中的接口或c#

一个类是完成这项工作的实际实现。

够简单吗? :)