类和协议有什么区别?

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

有人能用简单的语言提供一个例子吗?

谢谢


1
你是否熟悉其他面向对象编程语言,比如Java、C++或C#?与其从头开始解释,不如提供与另一种语言的类比会更容易理解。 - Sergey Kalinichenko
6个回答

16

类(Class)是根据该类的特定实现而创建一个或多个对象的蓝图。这好比切出黄油饼干的模具,模具的属性(形状、大小、高度)定义了可以用它切出的饼干。您只有一个模具(类),但可以用它创建许多饼干(该类的实例,即对象)。所有饼干都基于特定的模具。同样地,所有作为该类实例的对象在其属性方面都是相同的。

类 = 数据(data)方法(methods)(特殊函数),全部复杂地捆绑在一起。

类定义它们的内部内容(数据)是什么+它们可以执行什么样的工作(方法)。内容基于保存各种数字类型、字符串、常数和其他更复杂内容的变量以及块代码组成的方法(当执行时)使用各种数据执行一些计算操作。

类中定义的所有方法都有其定义-定义方法的名称+该方法处理哪些数据(如果有)以及该方法将哪些数据(如果有)传递给其他人进行处理。类中定义的所有方法也都有实现-提供处理的实际代码-它是方法的内部工作。在其中有处理数据的代码,也可以请求其他方法对子数据进行子处理。因此,类是编程中非常高妙的类型。

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

协议是一个或多个方法声明的集合,该集合具有名称并表示协议。我说声明,因为共同由特定协议定义的方法没有任何实现代码定义。唯一存在的是它们声明的名称。在类中,您不仅定义该类具有哪些方法,还定义了如何完成该工作。但是,在协议中的方法没有任何实现。

让我们再用一个现实生活的比喻来帮助理解。如果你来我家住一周,你需要遵守我的整洁协议。整洁协议包括三个方法-每天洗碗、打扫房间和通风换气。这三个方法,是我定义的...你需要执行它们。但我并不关心实现的细节应该是什么样子的,我只是名义上定义了这些方法。你会实现它们,也就是说你会定义这些工作(这些方法)的细节。我只要求你遵守我的协议,并按照你认为合适的方式来实施它。

结局 - 你可以声明一个类,也可以单独声明一个协议。你可以声明,这个类除了自己的方法外,还将采用或遵守该协议,即该类将实现该协议的方法。


协议是一组方法声明,而不是你所解释的定义。 - jscs

3
这里引用了Objective-C编程语言中的简单说明,其中明确了协议的三个用途:
- 声明其他类需要实现的方法 - 声明对象的接口并隐藏其类 - 捕捉在继承关系之外的类之间的相似之处
因此,协议只是声明方法,而不提供实现。采用协议的类需要实现协议中的方法。
代理是协议有用的一个例子。例如,考虑UITableViewDataSource协议。任何类都可以采用该协议,并且任何采用该协议的类都可以作为表格的数据源。表格视图不关心充当其数据源的对象的类型;它只需要知道对象实现了特定一组方法。您可以使用继承来实现,但这样所有数据源对象都必须派生自一个公共基类(比NSObject更具体)。使用协议而不是继承可以让表格调用像-tableView:willBeginEditingRowAtIndexPath:-tableView:heightForRowAtIndexPath:这样的方法,而无需了解数据源的其他信息。

2

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


2

1

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

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


0

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

类是实际执行任务的实现。

够简单吧? :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接