上一章Objective-C开发教程请查看:iOS国际化/本地化完全操作笔记
Objective-C多态就是父类的指针指向子类的对象,例如P *obj = [[C alloc]init],其中P是父类,C是子类。使用多态的好处和作用是什么呢?假设后来发现C中的功能实现效率太差了,那么自然想改动或重新实现,在不改动C的情况下,我们可以新建一个类D继承P,在调用的地方换为C的实例对象就行了。
所以OC多态性也没有多复杂,就是上面说的了。这常常在设计模式中被提及到,不过我放弃设计模式了,只需知道多态提供横向扩展就行了,其它专注数据结构和算法,没有好的算法,模式再漂亮也没什么用,再说设计模式真是对编程限制太大。时间有限,就不花费不必要的时间到不重要的东西上了,毕竟开发软件要涉及的东西太多了!
Objective-C多态的用法
上面说到了,OC的多态就是父类的指针指向子类的对象,另外还有一个需要注意的细节,那就是子类的初始化函数可以和父类的不同,子类的初始化由子类自定义。但是对象调用的函数或方法只能是父类中声明的方法,不能调用子类特有的方法,如需要可以使用强制类型转换。
下面我们看一个OC多态的使用示例,首先是父类的声明:
#import <Foundation/Foundation.h>
@interface ANLog : NSObject
-(void)info: (NSString*)message;
-(void)error: (NSString*)message;
-(void)warm: (NSString*)message;
-(void)debug: (NSString*)message;
@end
下面是父类的简单实现:
#import "ANLog.h"
@implementation ANLog
-(void)info: (NSString*)message{
NSLog(@"%@ [Info] %@", [NSDate new], message);
}
-(void)error: (NSString*)message{
NSLog(@"%@[Error] %@", [NSDate new], message);
}
-(void)warm: (NSString*)message{
NSLog(@"%@ [Warm] %@", [NSDate new], message);
}
-(void)debug: (NSString*)message{
NSLog(@"%@[Debug] %@", [NSDate new], message);
}
@end
以上父类是实现日志输出,接着发现父类提供的日志输出信息太少,那么可以纵向扩展,继承父类重新实现一个基本的日志输出类,头文件如下:
#import "ANLog.h"
@interface ANLBasicLog : ANLog
@property(nonatomic, copy)NSString *domain;
-(instancetype)initWithDomain: (NSString*)domain;
@end
下面是实现文件:
#import "ANLBasicLog.h"
@implementation ANLBasicLog
-(instancetype)initWithDomain: (NSString*)domain{
if(self = [super init]){
_domain = domain;
}
return self;
}
-(void)info: (NSString*)message{
NSLog(@"[%@ Info] %@", _domain, message);
}
-(void)error: (NSString*)message{
NSLog(@"[%@ Error] %@", _domain, message);
}
-(void)warm: (NSString*)message{
NSLog(@"[%@ Warm] %@", _domain, message);
}
-(void)debug: (NSString*)message{
NSLog(@"[%@ Debug] %@", _domain, message);
}
@end
接着到了项目第二个版本,想要一个全新的日志输出,那么这时可以重新继承父类,重新实现全部功能,如下是头文件:
#import "ANLog.h"
@interface ANAdvancedLog : ANLog
@property(nonatomic, copy)NSString *domain;
@property(nonatomic, assign)int lid;
-(instancetype)initWithDomain: (NSString*)domain andId: (int)lid;
@end
下面是实现文件:
#import "ANAdvancedLog.h"
@implementation ANAdvancedLog
-(instancetype)initWithDomain: (NSString*)domain andId: (int)lid{
if(self = [super init]){
_domain = domain;
_lid = lid;
}
return self;
}
-(void)info: (NSString*)message{
NSLog(@"[%@ Info]%d %@", _domain, _lid, message);
}
-(void)error: (NSString*)message{
NSLog(@"[%@ Error]%d %@", _domain, _lid, message);
}
-(void)warm: (NSString*)message{
NSLog(@"[%@ Warm]%d %@", _domain, _lid, message);
}
-(void)debug: (NSString*)message{
NSLog(@"[%@ Debug]%d %@", _domain, _lid, message);
}
@end
下面是实际的测试用例:
void testANLog(void){
ANLog *log = [[ANLog alloc]init];
[log info:@"get message: OK"];
[log error:@"password error"];
[log warm:@"warming message"];
[log debug:@"debug message"];
NSLog(@"");
ANLog *basicLog = [[ANLBasicLog alloc]initWithDomain:@"com.once.time"];
[basicLog info:@"basic info"];
[basicLog error:@"basic error"];
[basicLog warm:@"warming message"];
[basicLog debug:@"debug app"];
NSLog(@"");
ANLog *adlog = [[ANAdvancedLog alloc]initWithDomain:@"com.once.past" andId:154587];
[adlog info:@"basic info"];
[adlog error:@"basic error"];
[adlog warm:@"warming message"];
[adlog debug:@"debug app"];
NSLog(@"");
}
int main(int argc, const char * argv[]) {
testANLog();
return 0;
}
评论前必须登录!
注册