什么是抽象类
抽象类自身不生成实例,它是为了给所有继承它的子类提供统一的接口而定义的。
在超类中,只描述接口和公共部分的定义。这样在定义子类时,在子类中只声明那些需要具体定义的方法,这样的超类就是抽象类或者称为虚类。
类簇
类簇的概念
类簇(class cluster)就是定义相同的接口并提供相同功能的一组类的集合。仅公开接口的抽象类也称为类簇的公共类(public class)。各个具体类的接口由公共类的接口抽象化,并被隐藏在簇的内部。这些具体类不能被直接使用,一般会作为公共类的子类来实现,所以有时也称他们为私有子类。
实际编写代码时,公共类和普通类按照同样的方式使用,但是实际上被生成并存在在内存上的实例是隐藏在类簇中的某个类的实例。因为可以正确执行,所以程序几乎意识不到这点差异。类簇有一个机制,可以从多个已存在的类中挑选出最适合当前场景的类并且自动启用。
ps:百度百科:
类簇 是一群隐藏在通用接口下的与实现相关的类,使得我们编写的代码可以独立于底层实现(因为接口是稳定的)。如创建NSString对象时,你得到的可能是NSLiteralString,NSCFString,NSSimpleCString等。即不同的NSString对象调用同一个接口A,接口A的实现可能是不同的
编程中的注意事项
OC中没有专门构成类簇的语法。一般情况下,公共类默认为抽象类,而具体的类则是作为公共类的私有子类来实现。使用类簇时,不用在意和普通类的差别,但要注意以下两点:
1.查看实例所属的类时
对于类簇来说,所有的实例都是私有子类的实例,因此,从类簇的测试程序中我们可以看出,方法isMemberOfClass:即使是将公共类作为输入参数,也很难知道结果。
当实例所属类的处理策略被改变时,可以使用方法isKindOClass:判断是否为子类实例,使用方法respondsToSelector:判断是否为特定方法,这些方法都十分有效。
2.生成子类时
很多情况下,公共类作为抽象类被实现的时候,各个方法是在私有子类中具体实现的。因此,即便生成了直接继承公共类的子类,也不能立即产生用户想要的功能。
生成类簇的子类
类簇使多种类别实现抽象化,在公共类的外部只有类簇是可见的。下面说明一下如何产生基于扩展或改变类簇功能的类。因为类簇目前是作为Foundation框架的基本类来实现的,所以一般情况下,没有必要生成子类。
使用范畴
添加新的范畴可以扩展公共类的功能,也可以实现实例变量那样使用关联引用的功能。
在公共类添加的范畴也会被类簇中隐藏的子类所继承,所以类簇中所有的类都可以使用新添加的功能。
基本方法的重定义
类簇包含一小部分基本方法,其他方法都是在基本方法的基础上实现的。基本方法在子类中实现,而其他方法在公共类中实现。每个子类(私有类)中不同的实现细节都隐藏在基本方法中。也就是说,即使在类簇内部,也实现了过程抽象化和信息隐藏。
因此,定义私有数据结构及对其访问的基本方法是为了类簇生成新的子类的最好方式。
下面具体说明类簇的子类的实现方法:
1.确定私有数据结构
确定作为实例变量的数据结构,作为超类的类簇不能使用所有的数据结构。
2.定义初始化方法
定义init...这样的初始化方法。不能继承和使用init之外的超类的初始化方法。只要没有私有数据结构,就可以使用init,所以没必要定义初始化方法。
3.定义便利构造器
必要的话,以数据类型名作为前缀,定义生成临时对象的类方法。不能继承及使用超类的同样的方法。
4.定义基本方法
定义自己的基本方法。
5.定义其他方法
通过定义基本方法,公共类声明的方法可以暂且执行,但是利用生成数据结构的特征也许能够产生更加高效的方法,而且也可以重写这样的方法。如果已经在子类上单独扩展了功能,那么只要定义相应的方法就可以。