您的位置:首页 > 移动开发 > IOS开发

利用协议提供匿名对象

2016-06-06 00:00 399 查看
摘要: 利用协议,实现类似于Java中抽象父类

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。。。。

自己学习的一点小体会,记录了下来,分享出来
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息