“类族(class cluster)”是一种很有用的模式,可以隐藏“抽象基类(abstract base class)”背后的实现细节。
- Cocoa 中的类族
Objective-C 系统框架中普遍使用此模式,比如 UIKit
中的 UIButton
类。大部分的collection类都是类族,例如 NSArray
及其可变版本 NSMutableArray
。
创建button时调用类方法:
+ (instancetype)buttonWithType:(UIButtonType)buttonType;
该方法返回的对象类型取决于传入的按钮类型(button type)。而不管返回什么类型的对象,都继承自同一个基类 UIButton
。
这样做的意义:类的使用者无需关心创建出来的按钮属于哪个子类,也无需关心如何创建等细节(类似设计模式中的工厂模式)。
- 代码演示
假设有一个处理雇员的类,每个雇员(employee)有“名字(name)”和“薪水(salary)”两个属性,雇员有两种:开发者(developer)和设计者(designer)。
抽象基类示例代码:
//.h文件
typedef NS_ENUM(NSUInteger, EOCEmployType) {
EOCEmployeeTypeDeveloper,
EOCEmployeeTypeDesigner
};
@interface EOCEmployee : NSObject
@property (nonatomic, copy) NSString *name;
@property NSUInteger salary;
+ (EOCEmployee *)employeeWithType:(EOCEmployType)type;
//其他方法...
//.m文件
+ (EOCEmployee *)employeeWithType:(EOCEmployType)type
{
switch (type) {
case EOCEmployeeTypeDeveloper:
return [EOCEmployeeDeveloper new];
break;
case EOCEmployeeTypeDesigner:
return [EOCEmployeeDesigner new];
break;
default:
break;
}
}
实体子类的示例代码:
@interface EOCEmployeeDeveloper : EOCEmployee //继承自抽象基类
//相关属性和方法
@end
- 新增子类
向类族中新增实体子类时,有几点需要注意(以 NSArray
为例):
- 子类应继承自类族中的抽象基类;
- 子类应定义自己的数据存储方式;
子类必须用一个实例变量来存放数组中的高对象。NSArray
只是包在其他隐藏对象外面的壳,它仅仅定义了所有数组都具备的一些接口。 - 子类应重写抽象基类中指明需要重写的方法。
若添加NSArray
的子类,需实现count
及objectAtIndex:
等方法。