在Objective C中使用@protocols的主要原因是什么?

时间:2013-02-18 18:55:14

标签: objective-c objective-c-protocol

为什么我要使用协议而不是创建子类并继承方法..?

请向我解释一下,我对这个话题感到困惑,我对阅读这本书中的解释并不十分满意。

我在哪里使用协议而不是其他方式来获取方法..?如果我可以继承类并获取方法,为什么我要使用我需要定义方法的协议?

3 个答案:

答案 0 :(得分:6)

  

为什么我要使用协议而不是创建子类和   继承方法..?

协议使不相关的类可以实现相同的接口。然后,协议的客户端可以使用这些类中的每一个的实例。例如,UITableViewDataSource是一种协议,它提供一个接口,通过该接口,表可以从任何实现协议的对象请求数据。只要实现数据源接口,表视图就不关心对象的类型。

想象一下,如果所有表数据源都必须从公共类继承,那将是多么令人不快的事情! Objective-C仅提供单一继承,因此您有效地被限制为仅为数据源使用单一类型的对象。但是,对于协议,数据源可以是视图控制器,模型对象,甚至可以是远程对象。

更具体地说,协议允许一种多态形式。这意味着单个对象可以采用多种形式:例如视图控制器,表数据源,表委托,滚动视图委托。因为Objective-C是单继承语言,所以只能通过继承获得其中一个接口。你自己实现的其余部分,但这通常是有道理的,因为你通常采用一个给定的协议来定制其他对象的行为。

答案 1 :(得分:0)

因为子类化和协议是两回事。子类化扩展了具有新功能的类,同时继承了特定类的所有先前功能,而协议在应用于类时,只是向其添加功能而不从其继承任何内容;那个班级通常无关紧要。

协议最常用于Objective-C中的委托模式,其中对象可以将消息发送到另一个对象而不关心该对象是什么(即它的类)。

通常,委托被声明为:

 @property(nonatomic, assign) id < MyObjectDelegate > delegate;

请注意,属性的类是id - 实际上,您并不关心对象是汽车还是乌龟 - 您需要知道的是它是一个对象({ {1}})并以合同方式订阅您需要的功能。因此,如果您的委托是id类型,则可以调用[委托myStateChanged];或者,如果您的代表是汽车,您可以致电[委托myStateChanged]。您需要知道的是,如果您向其发送消息,它将接受它。

我会查阅并了解Objective-C代理的使用,因为我认为它将真正帮助您更好地理解协议以及它与子类的不同之处。我不知道你是否熟悉其他面向对象的编程语言,但如果是这样,协议与其他语言的接口最相似。

答案 2 :(得分:-2)

协议非常有用,因为您可以实现许多协议,而只能扩展一个类。