“類族”(class cluster)是一種很有用的模式(pattern),可以隱藏“抽象基類”(abstract base class)背后的實現細節。Objective-C的系統框架中普遍使用此模式。
創建類族
現在舉例來演示如何創建類族。假設有一個處理雇員的類,每個雇員都有“名字”和“薪水”這兩個屬性,管理者可以命令其執行日常工作。但是,各種雇員的工作內容卻不同。經理在帶領雇員做項目時,無須關心每個人如何完成其工作,僅需指示其開工即可。
首先要定義抽象基類:
typedef NS_ENUM(NSUInteger, EOCEmployeeType) { EOCEmployeeTypeDeveloper, EOCEmployeeTypeDesigner, EOCEmployeeTypeFinance, }; @interface EOCEmployee : NSObject @PRoperty (copy) NSString *name; @property NSUInteger salary; // Helper for creating Employee objects + (EOCEmployee*)employeeWithType:(EOCEmployeeType)type; // Make Employees do their respective day's work - (void)doADaysWork; @end @implementation EOCEmployee + (EOCEmployee*)employeeWithType:(EOCEmployeeType)type { switch (type) { case EOCEmployeeTypeDeveloper: return [EOCEmployeeDeveloper new]; break; case EOCEmployeeTypeDesigner: return [EOCEmployeeDesigner new]; break; case EOCEmployeeTypeFinance: return [EOCEmployeeFinance new]; break; } } - (void)doADaysWork { // Subclasses implement this. } @end
每個“實體子類”(concrete subclass)都從基類繼承而來。例如:
@interface EOCEmployeeDeveloper : EOCEmployee @end @implementation EOCEmployeeDeveloper - (void)doADaysWork { [self writeCode]; } @end
在本例中,基類實現了一個“類方法”,該方法根據待創建的雇員類別分配好對應的雇員類實例。這種“工廠模式”(Factory pattern)是創建類族的辦法之一。
Note:如果對象所屬的類位于某個類族中,那么在查詢其類型信息(introspection)時就要當心了,調用isMemberOfClass返回的是NO,因為創建的是其子類的實例。(可用isKindOfClass)
系統框架中有許多類族。大部分collection類都是類族,例如NSArray與其可變版本NSMutableArray。
新增實體子類:
新聞熱點
疑難解答