利用协议提供匿名对象
2016-06-06 00:00
399 查看
摘要: 利用协议,实现类似于Java中抽象父类
iOS中协议我们经常使用,今天通过学习又对协议有了新的认识,把它记录下来
学过Java的话肯定对抽象父类有所了解,抽象父类中定义了一些方法或者属性,但没有实现,他要求继承他的子类必须实现他的抽象方法。但是OC中没有该种语法,但是他提供了协议,通过协议,我们就可以实现类似的功能,下面就来看一下该种方式的使用
如果我们想定义一个车的类,车有车的属性和方法,所以要想成为车,就必须实现他的属性和方法,现在定义一个车的协议如下
上面的就类似与抽象父类,现在我们构建一个车的工厂类如下
注意,上面.m实现文件中用到了一个LCCar.h这个类,他就是遵守了我们刚才定义的那个车的协议,所以他就一个车,相当于抽象父类的具体实现子类,下面给出LCCar类的代码
这样我们就实现类似于抽象父类的概念,同时在创建车时,无需关心(也可以说成时候隐藏了)车的类型,只要是遵守了车的协议即可
自己学习的一点小体会,记录了下来,分享出来
iOS中协议我们经常使用,今天通过学习又对协议有了新的认识,把它记录下来
学过Java的话肯定对抽象父类有所了解,抽象父类中定义了一些方法或者属性,但没有实现,他要求继承他的子类必须实现他的抽象方法。但是OC中没有该种语法,但是他提供了协议,通过协议,我们就可以实现类似的功能,下面就来看一下该种方式的使用
如果我们想定义一个车的类,车有车的属性和方法,所以要想成为车,就必须实现他的属性和方法,现在定义一个车的协议如下
#import <Foundation/Foundation.h> /**定义车的协议,只要遵守该协议,就可以成为车**/ @protocol LCCarProtocol <NSObject> /*车名**/ @property (nonatomic, copy) NSString *carName; /**开车**/ - (void)carDrive; @end
上面的就类似与抽象父类,现在我们构建一个车的工厂类如下
//.h文件 #import <Foundation/Foundation.h> #import "LCCarProtocol.h" /**车的生产工厂**/ @interface LCCarFactory : NSObject + (instancetype)shareInstance; /**通过协议提供匿名对象,返回的车具体不知道是什么类型,我们不关注,只要是车就行**/ - (id<LCCarProtocol>)createCarWithName:(NSString *)carName; @end //.m文件实现 #import "LCCarFactory.h" #import "LCCar.h" @implementation LCCarFactory static id instance; + (instancetype)shareInstance { static dispatch_once_t predicate; dispatch_once(&predicate, ^{ instance = [[LCCarFactory alloc] init]; }); return instance; } - (id<LCCarProtocol>)createCarWithName:(NSString *)carName { LCCar *car = [[LCCar alloc] init]; [car setCarName:carName]; return car; } @end
注意,上面.m实现文件中用到了一个LCCar.h这个类,他就是遵守了我们刚才定义的那个车的协议,所以他就一个车,相当于抽象父类的具体实现子类,下面给出LCCar类的代码
//.h文件 #import <Foundation/Foundation.h> #import "LCCarProtocol.h" /**想要成为车,需要遵守车的协议,该类可以不对外公开*/ @interface LCCar : NSObject <LCCarProtocol> @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]; id<LCCarProtocol> car = [factory createCarWithName:@"火车"]; [car carDrive]; //打印结果如下 *********通过协议提供匿名对象********* 火车 is driving。。。。
自己学习的一点小体会,记录了下来,分享出来
相关文章推荐
- ios开发 设备指令集 armv6 armv7 armv7s armv64
- ios 支持64bit
- iOS 动画初步
- iOS多线程编程--GCD
- iOS 常用小技巧大杂烩(上)
- 修改状态栏iOS
- iOS app旧貌换新颜(一)Launch Page让Logo"飞"出屏幕
- ios之runtime
- ios之runtime
- iOS在很多场景下可以使用的带箭头的View
- ios获取软键盘完成事件
- iOS监听设备方向的方法
- ios移动输入框被软键盘遮挡
- IOS 拍照黑屏解决
- IOS开发(转载汇总)
- 文章标题
- iOS中几种常见的查找算法的比较
- CocoaPods 安装和使用
- iOS算法篇(二)选择排序算法
- iOS算法篇(一)快速排序算法