iOS中协议我们经常使用,今天通过学习又对协议有了新的认识,把它记录下来
学过Java的话肯定对抽象父类有所了解,抽象父类中定义了一些方法或者属性,但没有实现,他要求继承他的子类必须实现他的抽象方法。但是OC中没有该种语法,但是他提供了协议,通过协议,我们就可以实现类似的功能,下面就来看一下该种方式的使用 如果我们想定义一个车的类,车有车的属性和方法,所以要想成为车,就必须实现他的属性和方法,现在定义一个车的协议如下#import/**定义车的协议,只要遵守该协议,就可以成为车**/@protocol LCCarProtocol /*车名**/@property (nonatomic, copy) NSString *carName;/**开车**/- (void)carDrive;@end
上面的就类似与抽象父类,现在我们构建一个车的工厂类如下
//.h文件#import#import "LCCarProtocol.h"/**车的生产工厂**/@interface LCCarFactory : NSObject+ (instancetype)shareInstance;/**通过协议提供匿名对象,返回的车具体不知道是什么类型,我们不关注,只要是车就行**/- (id )createCarWithName:(NSString *)carName;@end//.m文件实现#import "LCCarFactory.h"#import "LCCar.h"@implementation LCCarFactorystatic id instance;+ (instancetype)shareInstance { static dispatch_once_t predicate; dispatch_once(&predicate, ^{ instance = [[LCCarFactory alloc] init]; }); return instance;}- (id )createCarWithName:(NSString *)carName { LCCar *car = [[LCCar alloc] init]; [car setCarName:carName]; return car;}@end
注意,上面.m实现文件中用到了一个LCCar.h这个类,他就是遵守了我们刚才定义的那个车的协议,所以他就一个车,相当于抽象父类的具体实现子类,下面给出LCCar类的代码
//.h文件#import#import "LCCarProtocol.h"/**想要成为车,需要遵守车的协议,该类可以不对外公开*/@interface LCCar : NSObject @end//.m文件实现#import "LCCar.h"@interface LCCar () { NSString *_carName;}@end@implementation LCCar//实现协议中开车方法- (void)carDrive { NSLog(@"%@ is driving。。。。",_carName);}//实现协议中属性的get set方法- (NSString *)carName { return _carName;}- (void)setCarName:(NSString *)carName { _carName = [carName copy];}@end
这样我们就实现类似于抽象父类的概念,同时在创建车时,无需关心(也可以说成时候隐藏了)车的类型,只要是遵守了车的协议即可
NSLog(@"*********通过协议提供匿名对象*********");LCCarFactory *factory = [LCCarFactory shareInstance];idcar = [factory createCarWithName:@"火车"];[car carDrive];//打印结果如下*********通过协议提供匿名对象*********火车 is driving。。。。
自己学习的一点小体会,记录了下来,分享出来