iOS:继承、分类和类扩展

一、继承

      继承是指一个新类拥有被继承类(父类)的全部属性和方法。例如,只有继承NSObject,才有创建对象的能力。NSObject是大部分类的基类(根类,root class)。

iOS:继承、分类和类扩展_第1张图片

      当A类继承B类,A类就拥有B类中所有成员变量(属性)和方法。这也是继承的主要目的。

      使用场景:当我们可以说通B是一个A时,就可以使用B继承A类。

      继承的好处:代码重用;继承的缺点:父类的改变影响所有的子类。子类与父类耦合度很高。当子类中需要有自己独特的行为,不想使用父类的方法,可以把父类的方法覆盖掉:直接在子类中用一样的名字写个方法。不用在.h中写,因为父类已经声明过了,直接在.m中重写。

      如果重写了父类的方法,但还想使用父类的功能。则使用super。用来调用父类的方法。可以认为,super就是指父类。

      在继承体系中方法调用的顺序:1)在自己类中找;2)如果没有就去父类中找;3)如果父类中没有,就去父类的父类中找……直到找到基类。

      OC中只有实现没有声明的方法,是私有方法,不能在外面直接访问。但是它不是绝对私有。

      继承的注意点:OC中,类方法也是可以继承的(通过子类的类名调用父类的类方法);类方法也是可以重写的;类方法可以和对象方法重名(+表示类方法,-表示对象方法);子类中不能定义与父类中同名的成员变量。

       OC是单继承:一个类只能继承一个直接父类;
       OC是多层继承:B类继承A类,C类可以继承B类……

二、分类

     分类(类别)作用:扩展已有类的功能

     1)为原来的类增加方法;

     2)在方法内部可以访问原有类的成员变量(但这些成员变量一定要定义在头文件中)

     操作方法:

     1)为原有的类创建一个分类;2)在分类中增加新的方法的声明和实现

     在左侧栏目文件夹处右键-New File-Objective-C File-File Type选Category-Class选你还要扩展的那个类-File填分类名称(不是文件名称)。

      注意点:

      1、分类中不能扩展原有类的成员变量!

      2、如果在分类用@property:在分类中只能生成getter setter方法的声明,不能生成方法的实现和成员变量。

      3、分类可以扩充系统自带的类的功能。例如,给NSObject增加分类会影响到所有的类,但是这个东西一定要谨慎使用(笔者之前扩展了UIButton类,导致真机上所有按钮点击功能异常,但测试发布时模拟器都正常,造成用户APP大面积坏死……)

      4、你不能在分类中定义与原有类同名方法,不同的分类之间也不可以有同名的方法。如果你在分类中增加了一个与原有类同名的方法,那么分类中的方法会覆盖原有类的方法。

      5、如果多个分类中有相同的方法,执行最后编译的方法。

      6、记得要#import 分类。

三、类扩展

      在.m文件中为类增加私有的成员变量(属性)和方法

      在左侧栏目文件夹处右键-New File-Objective-C File-File Type选extension-Class选你还要扩展的那个类-File填分类名称(不是文件名称)。但通常直接在原类.m文件里写:@interface 原有类名()——这是一个常用的方法,特别是在带xib的控制器页面,一些控件我们通常用类扩展的方式,存在扩展里面,这样使得这些控件成员是私有的,不会被外界干扰到。

      与分类不一样的是:类扩展的原类名称后面的括号中没有东西,也没有.m文件。

      注意:类扩展得到的属性和方法,都是私有的!在外界中无法直接使用,即无法直接get后者set到这些成员。但是可以在.h里提供方法接口来改变这些私有属性的情况。


iOS:继承、分类和类扩展_第2张图片

你可能感兴趣的:(iOS:继承、分类和类扩展)