国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > iOS > 正文

ios類族

2019-11-09 14:49:50
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

類族是一種很有用的模式,可以隱藏抽象基類背后的實(shí)現(xiàn)細(xì)節(jié),比如UIButton類,要想創(chuàng)建按鈕要使用類方法

+(UIButton*)buttonWithType:(UIButtonType)type;

該方法返回對(duì)象取決于按鈕的類型,他們都繼承自同一個(gè)基類,這樣是使用者不許關(guān)興創(chuàng)建出來(lái)的按鈕具體屬于哪個(gè)子類。

現(xiàn)在舉例來(lái)演示如何創(chuàng)建類族,假設(shè)有一個(gè)處理雇員的類,每個(gè)雇員都有“名字”和“薪水”這兩個(gè)屬性,管理者可以命令其執(zhí)行日常工作,但是,各種雇員的工作內(nèi)容卻不同,經(jīng)理在帶領(lǐng)雇員做項(xiàng)目時(shí),無(wú)須關(guān)心每個(gè)人如何完成其工作,僅需指示其開(kāi)工即可。

首先要定義抽象基類:

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 

每個(gè)“實(shí)體子類”(concrete subclass)都從基類繼承而來(lái),例如:

@interface EOCEmployeeDeveloper : EOCEmployee  @end   @implementation EOCEmployeeDeveloper   - (void)doADaysWork {      [self writeCode];  }   @end 

我們經(jīng)常需要向類族中新增實(shí)體子類,不過(guò)這么做的時(shí)候得留心。在Employee這個(gè)例子中,若是沒(méi)有“工廠方法”(factory method)的源代碼,那就無(wú)法向其中新增雇員類別了。然而對(duì)于Cocoa中NSArray這樣的類族來(lái)說(shuō),還是有辦法新增子類的,但是需要遵守幾條規(guī)則。這幾條規(guī)則如下。

子類應(yīng)該繼承自類族中的抽象基類。

若要編寫NSArray類族的子類,則需令其繼承自不可變數(shù)組的基類或可變數(shù)組的基類。

子類應(yīng)該定義自己的數(shù)據(jù)存儲(chǔ)方式。

開(kāi)發(fā)者編寫NSArray子類時(shí),經(jīng)常在這個(gè)問(wèn)題上受阻。子類必須用一個(gè)實(shí)例變量來(lái)存放數(shù)組中的對(duì)象。這似乎與大家預(yù)想的不同,我們以為NSArray自己肯定會(huì)保存那些對(duì)象,所以在子類中就無(wú)須再存一份了。但是大家要記住,NSArray本身只不過(guò)是包在其他隱藏對(duì)象外面的殼,它僅僅定義了所有數(shù)組都需具備的一些接口。對(duì)于這個(gè)自定義的數(shù)組子類來(lái)說(shuō),可以用NSArray來(lái)保存其實(shí)例。

子類應(yīng)當(dāng)覆寫超類文檔中指明需要覆寫的方法。

在每個(gè)抽象基類中,都有一些子類必須覆寫的方法。比如說(shuō),想要編寫NSArray的子類,就需要實(shí)現(xiàn)count及“objectAtIndex:”方法。像lastObject這種方法則無(wú)須實(shí)現(xiàn),因?yàn)榛惪梢愿鶕?jù)前兩個(gè)方法實(shí)現(xiàn)出這個(gè)方法。

在類族中實(shí)現(xiàn)子類時(shí)所需遵循的規(guī)范一般都會(huì)定義于基類的文檔之中,編碼前應(yīng)該先看看。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 灵丘县| 邛崃市| 龙陵县| 化德县| 通江县| 泰安市| 奉贤区| 红桥区| 金坛市| 临桂县| 弥渡县| 佛坪县| 汶川县| 怀柔区| 武川县| 巴楚县| 八宿县| 远安县| 连城县| 巴马| 宝兴县| 社旗县| 郎溪县| 历史| 勃利县| 石屏县| 永和县| 恩施市| 濮阳市| 南城县| 靖西县| 红原县| 大同县| 八宿县| 龙泉市| 浦县| 墨江| 衡阳县| 涟源市| 元谋县| 安平县|