Object-C中继承 ,Category,Extension 使用与区别
前言
在对于框架封装的时封装的功能模块大多是通用模块,为了减少耦合和代码冗余对于一些项目里的个性需求功能一般不会封装。但这样会面临在项目实施中,部分功能无法实现或者实现起来很麻烦,这种情况下类的继承,扩展就可以方便的解决以上问题。同时在对同系统类做个性化定制的时候也有很好的效果。为此整理了一下继承,分类,扩展的使用方法。
继承
继承是一个类可以从现有的类中派生出来,它可以在保持原类有的特性基础上进行扩展,增加功能。是面向对象编程的基础特点之一。
OC中的继承特性
- Object-C中只支持单继承的方式。
- 通过继承可以拥有父类的全部方法和属性,但只支持public继承。
- NSObject是所有类的基类。
实例
//父类
@interface FatherClass:NSObject
///
@end
@interface ChildrenClass:FatherClass
///
@end
分类(Category)
category是Objective-C 2.0之后添加的特性,叫做分类或类别。主要作用是为已经存在的类添加方法或重写方法。
分类特点
- 在不修改原来类的基础上,类扩展方法,添加属性。
- 给系统自带的类扩展方法。
- 声明私有方法
- 对同一个类做多扩展
实例
原始类
@interface FYLog : NSObject
//原始方法
-(void) printString;
@end
#import "FYLog.h"
@interface FYLog ()
//私有成员
@property(atomic,copy) NSString *strData;
@end
@implementation FYLog
-(instancetype) init
{
if (self =[super init]) {
self.strData = @"FYLog";
}
return self;
}
-(void) printString
{
NSLog(@"FYLog");
NSLog(@"strData:%@",self.strData);
}
@end
分类
#import "FYLog.h"
NS_ASSUME_NONNULL_BEGIN
@interface FYLog (Customer)
//添加属性
@property(atomic,copy) NSString *keyValue;
//声明私有方法
@property(atomic,copy) NSString *strData;
-(void) printString1;
@end
NS_ASSUME_NONNULL_END
#import "FYLog+Customer.h"
#import <objc/runtime.h>
#ifndef FYLogKeyValue
#define FYLogKeyValue @"__FYLogKeyValue"
#endif
@implementation FYLog (Customer)
-(void)setKeyValue:(NSString *)keyValue{
objc_setAssociatedObject(self, FYLogKeyValue, keyValue,OBJC_ASSOCIATION_COPY_NONATOMIC);
}
-(NSString *)keyValue{
return objc_getAssociatedObject(self, FYLogKeyValue);
}
-(void) printString
{
NSLog(@"Customer");
NSLog(@"strData:%@",self.strData);
}
-(void) printString1
{
NSLog(@"printString1");
NSLog(@"keyValue:%@",self.keyValue);
}
@end
Category添加属性
扩展(Extension)
Extension被称之为扩展。Extension跟Category看起有些类似,不过Extension和Category完全是两个东西。Extension只有.h文件。只对方法变量进行声明不会有具体实现。 Extension一般用于声明私有方法,私有属性,私有成员变量。
扩展特点
- Extension可以声明方法
- 可以声明属性、成员变量。
实例
#import "FYLog.h"
NS_ASSUME_NONNULL_BEGIN
@interface FYLog ()
//声明私有方法
@property(atomic,copy) NSString *strData;
@end
总结
在OC中继承并没有在C++那么多用法。但是OC继承仍然是一个很好的特别减少大量的代码冗余。对于分类(category)与扩展(extension),在分类(category)可以实现私有方法声明,属性添加的情况下,扩展(extension)其实就显得有点鸡肋了。不过扩展(extension)相比分类(category)在私有成员变量声明上还是方便些。
同时个人认为继承,分类,扩展等是对系统,框架类扩展的基础方法。希望上诉整理能对大家在使用扩展系统方法,个性化定制类时有用处。