使用Protocol vs Inheritance有什么优缺点?

use*_*951 5 inheritance objective-c

在objective-c?

我上了一堂课,然后我决定要另一堂课,就像第一堂课一样.我应该使用协议并确保两个类都支持该协议,还是应该创建一个父类并确定这两个类是否从该类继承?

注意:

这些类是:Business,Catalog,AddressAnnotation(目前仅适用于业务)和AddressAnnotationView(目前仅适用于业务).我想在Catalog上使用相同的东西.还有BGGoogleMapCacheForAllAnnotations可以管理注释何时聚集在一起(现在应该能够同时处理Catalog和Business的AddressAnnotation.还有BGGoogleMap View Controller我想转变为父类.

Met*_*ble 8

如果使用协议,则必须定义两种类类型共享的方法两次.协议通常保留用于特定模式,例如委派模式,以增加安全性并使您更难以犯错,或者已经嵌入在类层次结构中的几个类需要共享公共方法并将此共享记录在某种方式.如果一个类可以表示为另一个类的更专业版,则应该继承.

例如,假设你Vehicle在游戏中有一个类,它知道如何做各种各样的事情,比如四处走动.如果你想创建一个Car类,你可能Vehicle会继承该类,以便继承它的所有方法实现; 要么批量使用它们,要么实现自己的方法版本,可能在调用超类的实现之前执行特定于子类的任务.子类化是指您希望在以某种方式修改超类的特征和行为时继承它们的特征和行为.当必须将其他数据添加到类中时(例如实例变量)尤其如此,因为您不能对类别执行此操作(尽管您可以使用Class Extension,通常被视为一种私有接口).通常,子类比其超类具有更专业的目的.

协议只是协议.他们在那里是为了防止你搞砸或遗忘某些东西,并确保每个对象都能达到预期的效果,当类不符合预期时,会触发编译器警告.这对于委托等模式很重要,因为它是确保委托实现除了打破封装和知道委托的对象类型之外所需的方法的唯一方法.例如,从我的一个项目中查看下面的代码.

//SGSprite.h
@protocol SGSpriteDelegate
    - (BOOL) animation:(int)animationIndex willCompleteFrameNumber:(int)frame forSprite:(id)sender;
@end

@interface SGSprite : NSObject
@property (nonatomic, assign) id<SGSpriteDelegate> delegate;
@end

//SGViewController.h
@interface SGViewController : UIViewController <SGSpriteDelegate>
    //...dreadfully boring stuff
@end
Run Code Online (Sandbox Code Playgroud)

许多类使用我的SGSprite类来渲染纹理2D四边形.有时,他们需要知道sprite何时到达某个动画帧,因此SGSprite实例需要在其代理上调用一个方法,让他们知道何时到达某些帧.确保此类实例的委托实现此方法的唯一方法,并且实际上,如果有人尝试分配不作为委托的对象,则警告我是通过使用协议.您会注意到,如果我只是让委托变得简单,那么id每当我在我的委托上调用此方法时都会收到警告,因为它的实现无法找到,而如果我导入委托的标头/静态类型委托,则该类不再封装好.

在大多数情况下,您在技术上不需要协议; 您可以在通常遵守所述协议的所有类中定义所有没有协议的方法,并且一切都可以正常工作.但是,不再记录这些常用方法.因此,除了知道某些类或匿名对象实现您需要它们实现的方法的安全性之外,您还可以快速了解什么是什么以及如何实现.协议适用于需要确保类或类实例实现某些方法的情况,尤其是当不知道对象的类型以保持类封装时.