在目标C中使用@协议的主要原因是什么



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

请给我解释一下,我对这个话题很困惑,我对我读的书中的解释不太满意。

我在哪里使用协议而不是其他方式来获得方法。。?如果我可以对一个类进行子类化并获得方法,为什么我要使用一个需要定义方法的协议?

为什么我想使用一个协议而不是创建一个子类继承方法。。?

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

想象一下,如果所有表数据源都必须从一个公共类继承,事情会多么令人不快!Objective-C只提供单一继承,因此您实际上只能为数据源使用单一类型的对象。然而,对于协议,数据源可以是视图控制器、模型对象,甚至可能是远程对象。

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

因为子类化和协议是两回事。子类扩展了具有新功能的类,同时继承了特定类以前的所有功能,而协议在应用于类时,只是向其添加功能,而不从中继承任何内容;那门课通常是什么并不重要。

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

通常情况下,委托被声明为:

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

注意,属性的类是id——本质上,你不在乎对象是汽车还是乌龟——你只需要知道它是一个对象(id),并且它根据合同订阅了你需要的函数。因此,如果你的委托类型是turtle,你可以调用[delegate myStateChanged];或者,如果您的代理人是一辆汽车,您可以拨打[delegate myStateChanged]。你所需要知道的是,如果你向它发送消息,它会接受它

我会查阅并阅读有关Objective-C委托的使用,因为我认为它将真正帮助您更好地理解协议,以及它与子类化的区别。我不知道你是否熟悉其他面向对象的编程语言,但如果熟悉,协议与其他语言中的接口最相似。

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

相关内容

  • 没有找到相关文章

最新更新