Objective-C多态性和继承 – Objective-C开发教程

上一章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

【Objective-C多态性和继承 – Objective-C开发教程】下面是实现文件:
#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; }

    推荐阅读