Effective Objective-C 2.0 — 第9条:以“类族模式”隐藏实现细节

第9条:以“类族模式”隐藏实现细节

  • 类族模式可以把实现细节隐藏在一套简单的公共接口后面
  • 系统框架中经常使用类族
  • 从类族的公共抽象基类中继承子类时要当心,若有开发文档,则应首先阅读

“类族”(class cluster) is a 模式(pattern),将实现细节隐藏在抽象基类后面,以保持接口间接

Objective-C 的框架中普遍使用此模式。比如UIKit框架中 有一个 UIButton的类。

+ (UIButton *) buttonWithType:(UIButtonType)type;

该方法返回的对象,其类型取决于传入的按钮类型。但它们都继承自同一个基类 : UIButton

id maybeAnArray = /*...*/;
if ([maybeAnArray class] == [NSArray class]) {
    //will never be hit
}

NSSArray 是个类族, 上述代码 if永远不能为真,,因为由 NSArray 的初始化方法所返回的那个实例其类型是隐藏在类族公共接口(public facade)后面的某个内部类型(internal type)

若要判断某对象是否位于类族中,不要直接检测两个“类对象”是否相同,而应该采用下列代码:

if ([maybeAnArray isKindOfClass:[NSArray class]])  {
            
}

如Cocoa中NSArray这样的类族 ,新增子类 需要遵守的规则:

  • 子类应带继承自类族中的抽象基类
  • 子类应该定义自己的数据存储方式
  • 子类应当复写超类文档中指明需要复写的方法