当我们需要为已有的类扩展一些新的行为和属性又不想创建子类时,我们就可以想到类别与扩展。
目录
类别
类别
OC的动态特征允许我们使用类别为现有的类添加新方法,且不需要创建子类,不需要访问原有类的源代码。通过使用类别我们可以动态地为现有的类添加新方法,且将类定义模块化地分布到多个文件中。
在这里用类别实现一个胡氏整型,它可以调用方法实现四则运算
得到的运行结果如下:
有关类别还有以下需要注意:
利用类别对类进行模块化设计
利用类别中的方法会被添加到指定类中这条性质,可以实现类的模块化设计
使用类别调用私有方法
可以在类别中添加类的实现部分定义的方法来让函数可以调用这个方法。
注意:我们的类别中其实什么都不用定义,只需要在我们的main函数前面声明我们需要声明的方法即可。
当直接尝试调用在类的实现部分定义的方法时,编译器给出了错误警告,那么我们尝试用类别声明后再调用该函数。
在类别中声明后再调用该函数得到如下结果:
扩展
扩展用来临时对某个类的接口进行扩展,类实现部分需要同时实现类接口部分的方法和扩展部分的方法。定义扩展时,可以额外增加实例变量,也可以自动合成存取方法。
这里示范一下用扩展来为小阿尼亚添加一个伙伴邦德,并添加打印阿尼亚一家的方法
扩展:
运行结果如下:
区别与联系
1、我们在类别中通常只能定义方法,而不能定义属性,同时当我们创建了一个类别,会出现一个.m和一个.h文件,。我们的类别的.h文件中定义的方法一般是在.m文件中实现的,然后将类别引入主函数,我们就可以使用其方法了,可以用类别来调用私有方法。
2、而对于扩展,它只有一个.h文件,我们既可以声明我们的属性,又可以声明我们的方法,我们在扩展中声明的方法要在我们类的实现部分实现,我们的扩展中既可以添加属性,也可以添加方法。
3.总的来说,类别和扩展都是用于扩展已有类,但它们在功能和使用方式上有所区别。类别允许为类添加新的方法,并且方法会被共享和继承,而扩展主要用于在类的实现文件中添加私有的方法和属性,以及隐藏实现细节。
4.类别与扩展都可以为原来的类添加新的方法,但是类别的方法不实现系统不会提供警告,扩展的方法不提供实现系统会提示警告。