“類族(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:
等方法。