【Effective Objective-C 2.0 读书笔记】第九条:以“类族模式”隐藏实现细节

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

“类族”(class cluster)是一种很有用的模式(pattern),可以隐藏“抽象基类”(abstract base class)背后的实现细节。

Objective-C的系统框架中普遍使用此模式。

创建类族

首先定义抽象基类

每个“实体子类”(concrete subclass)都从基类继承而来。

Objective-C语言没办法指明某个基类是“抽象的”(abstract)。开发者通常会在文档中写明类的用法。这种情况下,基类接口一般都没有名为“init”的成员方法。

这暗示该类的实例也许不应该由用户直接创建。

Cocoa里的类族

大部分collection类都是类族。

例如:

在使用NSArray的alloc方法来获取实例时,该方法首先会分配一个属于某类的实例,此实例充当“占位数组”(placeholder array)。该数组稍后会转为另一个类的实例,而那个类则是NSArray的实体子类。

像NSArray这样的类的背后其实是一个类族(对于大部分collection类而言都是这样)

下面是一个错误示例:

id maybeAnArray = /* …*/;

if([maybeAnArray class] == [NSArray class]){

// will never be hit

}

知道了NSArray是一个类族,就知道if语句永远不会为真

因为[maybeAnArray class]所返回的类绝不可能是NSArray类本身,因为由NSArray的初始化方法所返回的那个实例其类型在类族公共接口(public facade)后面的某个内部类型(internal type)。

不过仍有办法可以判断出某个实例所属的类是否位于类族中。

使用类查询方法(introspection method)

id maybeAnArray = /*…*/;

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

//will be hit

}

向类族中增加新子类,遵守规则:

1.子类应该继承自类族中的抽象基类

2.子类应该定义自己的数据存储方式(抽象基类只是包在其他隐藏对象外面的壳,它仅仅定义了所有子类都需具备的一些接口)

3.子类应当覆写超类文档中指明需要覆写的方法

【要点】

1.类族模式可以把实现细节隐藏在一套简单的公共接口后面

2.系统框架中经常使用类族

3.从类族的公共抽象基类中继承子类时要当心,若有开发文档,则应先阅读

你可能感兴趣的:(【Effective Objective-C 2.0 读书笔记】第九条:以“类族模式”隐藏实现细节)