“類族”(class cluster)是一種很有用的模式(pattern),可以隱藏“抽象基類”(abstract base class)背后的實現(xiàn)細節(jié)。Objective-C的系統(tǒng)框架中普遍使用此模式。
創(chuàng)建類族
現(xiàn)在舉例來演示如何創(chuàng)建類族。假設(shè)有一個處理雇員的類,每個雇員都有“名字”和“薪水”這兩個屬性,管理者可以命令其執(zhí)行日常工作。但是,各種雇員的工作內(nèi)容卻不同。經(jīng)理在帶領(lǐng)雇員做項目時,無須關(guān)心每個人如何完成其工作,僅需指示其開工即可。
首先要定義抽象基類:
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
在本例中,基類實現(xiàn)了一個“類方法”,該方法根據(jù)待創(chuàng)建的雇員類別分配好對應(yīng)的雇員類實例。這種“工廠模式”(Factory pattern)是創(chuàng)建類族的辦法之一。
Note:如果對象所屬的類位于某個類族中,那么在查詢其類型信息(introspection)時就要當心了,調(diào)用isMemberOfClass返回的是NO,因為創(chuàng)建的是其子類的實例。(可用isKindOfClass)
系統(tǒng)框架中有許多類族。大部分collection類都是類族,例如NSArray與其可變版本NSMutableArray。
新增實體子類:
新聞熱點
疑難解答