Object-C中继承 ,分类(category),扩展(extension)使用与区别

Object-C中继承 ,Category,Extension 使用与区别

前言

在对于框架封装的时封装的功能模块大多是通用模块,为了减少耦合和代码冗余对于一些项目里的个性需求功能一般不会封装。但这样会面临在项目实施中,部分功能无法实现或者实现起来很麻烦,这种情况下类的继承,扩展就可以方便的解决以上问题。同时在对同系统类做个性化定制的时候也有很好的效果。为此整理了一下继承,分类,扩展的使用方法。

继承

继承是一个类可以从现有的类中派生出来,它可以在保持原类有的特性基础上进行扩展,增加功能。是面向对象编程的基础特点之一。
OC中的继承特性

  • Object-C中只支持单继承的方式。
  • 通过继承可以拥有父类的全部方法和属性,但只支持public继承。

实例

//父类
@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)在私有成员变量声明上还是方便些。
同时个人认为继承,分类,扩展等是对系统,框架类扩展的基础方法。希望上诉整理能对大家在使用扩展系统方法,个性化定制类时有用处。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值