个性化阅读
专注于IT技术分析

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

下面是实现文件:

#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;
}
赞(0)
未经允许不得转载:srcmini » Objective-C多态性和继承 – Objective-C开发教程

评论 抢沙发

评论前必须登录!