Categorg(类目)
类目特性
- 动态的为已经存在的类添加方法
- 保证类的原始设计规模可以变小,功能增加时再通过类目扩展
- 不需要访问原始类的源代码
- 不需要创建子类
类目特性的需求场景
- 原始类已经存在,例如系统提供的类NSString、NSArray
- 需要为原始类拓展自定义的功能
- 不能通过继承原始类的方式
提需求
为NSArray类添加一个拓展方法
— (NSArray *)take:(NSInteger)n;
用来获取数组中的前n个元素数组
Extension(延展)
延展特性
- 延展是一种匿名的类目
- 延展中可以添加成员变量(类目不可以)
- 延展的文件只创建接口文件
- 延展的方法接口需要在原始类中进行
延展特性的需求场景
- 原始类是由程序员自己编写的类,例如HHAnimal
- 需要为原始类拓展自定义的功能
- 不希望将代码的实现部分分开编写
- 不能通过继承原始类的方式
提需求
为原始类HHAnimal添加延展文件,将HHAnimal的接口文件分成两部分
在延展文件内添加便利构造器
+ (instancetype)animal;
在原始类的实现文件,实现延展中的方法
Protocol(协议)
协议特性
- OC语言内没有多继承
- OC语言内没有抽象类
- OC语言通过协议特性为原始类添加接口
协议特性的需求场景
同一个方法接口需要在不同的自定义类中使用
通过协议特性,为不同的自定义类添加相同的接口
在自定义原始类的实现文件中,实现协议中定义的方法
提需求
为不同的自定义类添便利构造器
+ (instancetype) create;
在自动以的原始类中实现便利构造器的功能
总结:
- 类目添加的方法接口要在类目的实现文件内去实现方法功能;
- 延展添加的方法接口要在原始类的实现文件内去实现方法功能;
- 协议添加的方法接口要在接受协议的类的原始文件内实现方法功能;