類族是一種很有用的模式,可以隱藏抽象基類背后的實現細節,比如UIButton類,要想創建按鈕要使用類方法
+(UIButton*)buttonWithType:(UIButtonType)type;
該方法返回對象取決于按鈕的類型,他們都繼承自同一個基類,這樣是使用者不許關興創建出來的按鈕具體屬于哪個子類。
現在舉例來演示如何創建類族,假設有一個處理雇員的類,每個雇員都有“名字”和“薪水”這兩個屬性,管理者可以命令其執行日常工作,但是,各種雇員的工作內容卻不同,經理在帶領雇員做項目時,無須關心每個人如何完成其工作,僅需指示其開工即可。
首先要定義抽象基類:
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 我們經常需要向類族中新增實體子類,不過這么做的時候得留心。在Employee這個例子中,若是沒有“工廠方法”(factory method)的源代碼,那就無法向其中新增雇員類別了。然而對于Cocoa中NSArray這樣的類族來說,還是有辦法新增子類的,但是需要遵守幾條規則。這幾條規則如下。
子類應該繼承自類族中的抽象基類。
若要編寫NSArray類族的子類,則需令其繼承自不可變數組的基類或可變數組的基類。
子類應該定義自己的數據存儲方式。
開發者編寫NSArray子類時,經常在這個問題上受阻。子類必須用一個實例變量來存放數組中的對象。這似乎與大家預想的不同,我們以為NSArray自己肯定會保存那些對象,所以在子類中就無須再存一份了。但是大家要記住,NSArray本身只不過是包在其他隱藏對象外面的殼,它僅僅定義了所有數組都需具備的一些接口。對于這個自定義的數組子類來說,可以用NSArray來保存其實例。
子類應當覆寫超類文檔中指明需要覆寫的方法。
在每個抽象基類中,都有一些子類必須覆寫的方法。比如說,想要編寫NSArray的子類,就需要實現count及“objectAtIndex:”方法。像lastObject這種方法則無須實現,因為基類可以根據前兩個方法實現出這個方法。
在類族中實現子類時所需遵循的規范一般都會定義于基類的文檔之中,編碼前應該先看看。
新聞熱點
疑難解答