为什么我要使用协议而不是创建子类并继承方法..?
请给我解释一下,我对这个话题很困惑,我对我正在阅读的书中的解释不太满意。
我在哪里使用协议而不是其他方式来获取方法..?如果我可以子类化一个类并获取方法,为什么我要在需要定义方法的地方使用协议?
为什么我要使用协议而不是创建子类并继承方法..?
请给我解释一下,我对这个话题很困惑,我对我正在阅读的书中的解释不太满意。
我在哪里使用协议而不是其他方式来获取方法..?如果我可以子类化一个类并获取方法,为什么我要在需要定义方法的地方使用协议?
为什么我要使用协议而不是创建子类并继承方法..?
协议使不相关的类都实现相同的接口成为可能。然后,协议的客户端可以使用这些类中的每一个的实例。例如,UITableViewDataSource
是一种提供接口的协议,通过该接口,表可以从任何实现该协议的对象中请求数据。表视图不关心对象的类型,只要它实现了数据源接口。
想象一下,如果所有表数据源都必须继承自一个公共类,那将是多么不愉快!Objective-C 仅提供单一继承,因此您将有效地被限制为您的数据源仅使用一种对象。但是,使用协议,数据源可以是视图控制器、模型对象,甚至可能是远程对象。
更具体地说,协议允许一种形式的多态性。这意味着单个对象可以采用多种形式:例如视图控制器、表数据源、表委托、滚动视图委托。由于 Objective-C 是一种单继承语言,因此您只能通过继承获得其中一个接口。其余的你自己实现,但这通常是有意义的,因为你通常采用给定的协议来自定义其他对象的行为。
因为子类化和协议是两个不同的东西。子类化扩展了具有新功能的类,同时继承了特定类的所有先前功能,而协议在应用于类时只是向它添加功能,而不从它继承任何东西;该类通常是什么并不重要。
协议最常用于Objective-C 中的委托模式,其中一个对象可以向另一个对象发送消息,而无需关心该对象是什么(即它的类)。
很多时候,委托被声明为:
@property(nonatomic, assign) id < MyObjectDelegate > delegate;
注意属性的类——本质上,你并不关心对象是汽车还是乌龟id
——你只需要知道它是一个对象(id
你需要它。因此,如果您的委托是 type turtle
,您可以调用 [delegate myStateChanged]; 或者,如果您的代表是汽车,您可以调用 [delegate myStateChanged]。您需要知道的是,如果您向它发送消息,它会接受它。
我会查找并阅读有关使用 Objective-C 委托的信息,因为我认为它确实可以帮助您更好地理解协议以及它与子类化有何不同。我不知道您是否熟悉其他面向对象的编程语言,但如果熟悉,协议与其他语言中的接口最相似。
协议很有用,因为您可以实现许多协议,而您只能扩展一个类。