分类和扩展与继承
文章目录
- @[TOC](文章目录)
- 分类
- 定义
- 分类的使用
- 使用场景
- 使用注意点
- Extension 扩展
- 分类和扩展的区别
- 继承的定义
- 使用
- 注意点
- 新建一个分类
文章目录
- @[TOC](文章目录)
- 分类
- 定义
- 分类的使用
- 使用场景
- 使用注意点
- Extension 扩展
- 分类和扩展的区别
- 继承的定义
- 使用
- 注意点
- 新建一个分类
分类基础知识
分类
- 分类是指为已有的类添加方法,也可以说是将很多很复杂的代码划分为几个分区。
定义
分类的作用是扩展已有类的功能
类别是OC特有的属性,可以在不改变类名和原类的实现的前提下,进行累的扩展。
为原有的类增加方法
在方法内部可以访问原有类的成员变量,但这些成员变量一定要定义在头文件中。
分类的使用
- 为原有的类创建一个分类
- 在分类中新增方法的实现和声明
使用场景
- 针对系统的一些类进行扩展,如NSSting,NSArray,NSNumber等类,系统本身不提倡使用继承去扩展方法,因为这些类内部的实现对继承有所限制,所以最好使用分类的方式进行扩展。
- 类别支持开发人员针对自己构建的类,把相关的方法分组到多个单独的文件中,针对大型复杂的类,可以提高维护和可读性,便于管理。
使用注意点
-
可以在分类中添加成员变量和方法,但是添加的成员变量不会自动生成setter和getter方法,需要在实现部分实现
OC是动态语言,方法真正的实现都是通过runtime实现的,虽然系统不会给生成setter/getter,但是我们可以通过runtime手动添加setter/getter
-
不能在分类中定义与原类相同名方法,不同分类中也不能定义同名方法,如果在分类中增加了与原类同名方法,那么分类中的方法会覆盖原有类的方法,如果多个分类中有相同方法,执行最后编译的方法。
-
分类需要#import
Extension 扩展
Extension是Category的一个特例,又被称为“匿名分类”
分类的使用:
扩展为一个类添加额外的原来没有的变量,属性,方法。
一般类扩展写在.m文件中
一般私有的属性写在.m文件中的扩展中
分类和扩展的区别
- 类别在原则上只能增加方法
- 类扩展不仅可以增加方法,还可以增加实例变量(或者属性),只是该实例默认是@private类型的(使用范围只在自身类,而非子类或者其地方)
- 类扩展中声明的方法没有被实现,编译器警告,但是类别中方法没有被实现编译器不会有任何提示。因为类扩展是在编译阶段被添加到类中,而类别是在运行中被添加到类中的
- 类扩展不能像类别那样拥有独立的实现部分(implementation),也就是说,类扩展所声明的方法必须依托对应类的实现部分来实现。
- 定义在.m文件中的类扩展方法是私有的,定义在.h中的类扩展方法是公有的
继承的定义
继承是指一个新类拥有被继承类(父类)的全部属性和方法。
优点:代码重用,父类在不知道具体实现的情况下,就可以构建业务流程。
缺点:父类的改变影响所有子类,子类和父类的耦合性较高。
使用
- 当子类中需要自己独特的行为,而不想使用父类的方法,可以把父类的方法覆盖掉,直接在子类中用同样的名字重写这个方法(重载over right)。
- 如果重写了父类的方法,但是还想在使用父类的功能,则使用super调用父类的方法。
- 在继承体系中,方法的调用顺序是:在自己的类中找,去父类找,去父类的父类中找,一直找到基类。
- OC中只有实现没有声明的方法,是私有方法,不能在外边直接访问,但它绝对不是私有
注意点
- OC中,类方法也可以是继承的(可以通过子类的类名调用父类的类方法),类方法也是可以重写的
- 类方法可以和对象方法重名(+表示类方法,-表示对象方法)。
- 子类中不能定义与父类同名的成员变量
- 一个类只能继承一个直接父类
- 可以多层继承
新建一个分类