自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Objective-C的分類和協(xié)議

移動(dòng)開發(fā) iOS
本文簡(jiǎn)單明了并且系統(tǒng)的介紹了iOS開發(fā)中Objective-C的分類和協(xié)議
1,使用分類(category)以模塊的方式向類添加方法.
2,創(chuàng)建標(biāo)準(zhǔn)化的方法類表供其他人實(shí)現(xiàn).
11.1:分類
使用場(chǎng)景:
1,有時(shí)候在處理類定義時(shí),可能想要為其添加一些新方法.
2,假如你參與了一個(gè)大型程序設(shè)計(jì)項(xiàng)目,并且作為項(xiàng)目的一部分,正在定義一個(gè)新類,新類中包含許多方法.你的任務(wù)是:為該類編寫處理文件系統(tǒng)的方法.其他項(xiàng)目成員的任務(wù)負(fù)責(zé)以下方法:創(chuàng)建和初始化該類實(shí)例,對(duì)該類中的對(duì)象執(zhí)行操作以及在屏幕上繪制該類對(duì)象的表示.
3,假如你已經(jīng)知道如何使庫(kù)中的類(例如fundation的數(shù)組類,NSArray),并且意識(shí)到你希望該類實(shí)現(xiàn)了一個(gè)或者多個(gè)方法.當(dāng)然,你可以編寫NSArray類的新子類并實(shí)現(xiàn)新方法.
針對(duì)以上所有情況的使用的解決方案可以用:分類.
分類提供了一種簡(jiǎn)單的方式,用它可以將類的定義模塊化到 相關(guān)方法的組或者分類中.分類還提供了一種擴(kuò)展現(xiàn)有類定義的簡(jiǎn)便方式,并且不必訪問類的源代碼.也無(wú)需創(chuàng)建子類.
Fraction原始代碼
  1. #import <Foundation/Foundation.h> 
  2. //define the Fraction class 
  3. @interface Fraction : NSObject 
  4. //聲明實(shí)例變量 
  5. int numerator; 
  6. int denominator; 
  7. //將實(shí)例變量轉(zhuǎn)換為屬性 
  8. @property int numerator,denominator; 
  9.   
  10. //定義實(shí)例方法 
  11. -(void) setTo: (int) n over: (int) d; 
  12. -(Fraction *) add: (Fraction *) fraction; 
  13. -(void) reduce; 
  14. -(double) convertToNumber; 
  15. -(void) print; 
  16. @end; 

然后,從接口部分刪除add:方法,并將其添加到新分類,同時(shí)添加其他三種要實(shí)現(xiàn)的數(shù)學(xué)運(yùn)算.新MathOps分類的接口部分應(yīng)該如下所示.

  1. #import "Fraction.h" 
  2. #interface Fraction (MathOps) 
  3. -(Fraction *) add: (Fraction *) f; 
  4. -(Fraction *) mul: (Fraction *) f; 
  5. -(Fraction *) sub: (Fraction *) f; 
  6. -(Fraction *) div: (Fraction *) f; 
  7. @end;  

注意:這既是接口部分的定義,也是現(xiàn)有接口部分的擴(kuò)展.因此必須包括原始接口部分.這樣編譯器就知道Fraction類.

#interface Fraction(MathOps):這句代碼告訴編譯器你正在為Fraction編寫新的分類.而且新的分類的名稱是MathOps.在這里沒有列出實(shí) 例變量,因?yàn)樵谝郧岸x的接口部分中已經(jīng)這樣做了.實(shí)際上如果再次列出的話,將接收到編譯器發(fā)出的語(yǔ)法錯(cuò)誤.
 
以上擴(kuò)展接口的作用是:告訴編譯器,你正在MathOps分類下為名為Fraction類添加擴(kuò)展.
 
可以將所有方法的定義放在一個(gè)實(shí)現(xiàn)部分,也就是,可以在一個(gè)實(shí)現(xiàn)文件中定義Fraction.h接口中的所有方法和 MathOps分類中的所有方法.也可以在單獨(dú)的實(shí)現(xiàn)部分定義分類的方法.在第二種情況下,這些方法的實(shí)現(xiàn)部分還必須找出方法所屬的分類.和接口部分一 樣,通過將類名稱擴(kuò)在類名稱之后的圓括號(hào)內(nèi)類確定方法所屬的分類.
 
  1. @implementation Fraction(MathOps) 
  2. //code for category methods 
  3. @end; 
 
 
關(guān)于分類的一些注意事項(xiàng):
1.盡管分類可以訪問原始類的實(shí)例變量,但是它不能添加自身的實(shí)力變量,如果需要添加變量,可以考慮創(chuàng)建子類.
2.分類可以重載類中的另一個(gè)方法,但是通常不這樣做,這種做法是拙劣的設(shè)計(jì)習(xí)慣.重載了一個(gè)方法之后,再也不能訪問原來的方法.
 
3.可以擁有多個(gè)分類,如果一個(gè)方法定義在多個(gè)分類中,該語(yǔ)句不會(huì)執(zhí)行指定使用哪個(gè)分類.
 
4,和一般接口不同的是,不必實(shí)現(xiàn)分類中的所有方法.
5.通過使用分類添加新方法來擴(kuò)展不僅會(huì)影響這個(gè)類,還會(huì)影響其所有子類.
11.2:協(xié)議:
協(xié)議是多個(gè)類共享一個(gè)方法列表.協(xié)議中列出的類沒有響應(yīng)的實(shí)現(xiàn),有其他人來實(shí)現(xiàn).
協(xié)議使用指定的名稱定義一組多少有點(diǎn)相關(guān)的方法.這些方法通常有文檔說明.所以你知道他們將如何執(zhí)行.因此如果需要,可以在自己的類中定義他們的實(shí)現(xiàn).
如果決定實(shí)現(xiàn)特定協(xié)議的所有方法,也就意味著要遵守這項(xiàng)協(xié)議.
定義一個(gè)協(xié)議:下面是一個(gè)例子
 
  1. @protocol NSCopying 
  2. - (id)copyWithZone: (NSZone *) zone; 
  3. @end;
如果你的類采用了NSCopy協(xié)議,則必須遵守實(shí)現(xiàn)名為copyWithZone的方法.通過在@interface行的一對(duì)<>內(nèi)列出協(xié)議名
 可以告訴編譯器你正在使用一個(gè)協(xié)議.這項(xiàng)協(xié)議的名稱放在類名和它的父類名稱之后.
@interface AddressBook: NSObject <NSCopy>如果你的類實(shí)現(xiàn)了多項(xiàng)協(xié)議,協(xié)議之間用逗號(hào)分開.
協(xié)議不引用任何類型,它是無(wú)類的.任何類都可以遵守Drawing協(xié)議.
可以使用ConformsToProtocal:方法檢查一個(gè)對(duì)象是否遵守某項(xiàng)協(xié)議.
例如有一個(gè)名為currentObject的對(duì)象,并且想要查看它時(shí)候是遵循Drawing協(xié)議.可以向他放松繪圖消息
 
  1.  id currentObjec; 
  2. if([currentObjec : ConformsToProtocal: @protoco (Drawing) : == YES]){ 
  3. ....//DO SOMETHING; 
  4. }
這里使用一個(gè)專用的@protocol指令用于獲取一個(gè)協(xié)議名稱.并產(chǎn)生一個(gè)Protocol對(duì)象.
通常在類型名稱之后的<>中添加協(xié)議名稱,可以借助編譯器來檢查變量的一致性.id <Drawing> currentObject;
這告訴編譯器currentObject將包含遵守Drawing協(xié)議的對(duì)象.如果這個(gè)對(duì)象遵循多個(gè)協(xié)議,可以用逗號(hào)隔開.
定義一項(xiàng)協(xié)議的時(shí)候,可以擴(kuò)展現(xiàn)有的協(xié)議.
@protocol Drawwing3D <Drawing>說明Drawwing3D協(xié)議也使用了Drawing協(xié)議.
***分類也可以采用一項(xiàng)協(xié)議
@interface Fraction (Stuff) <NSCopy,NSCoding>
此處Fraction類擁有一個(gè)Stuff分類,這個(gè)分類采用了NSCopy,NSCoding兩個(gè)協(xié)議.
和類名稱一樣,協(xié)議名稱也是唯一的.
非正式協(xié)議:
分正式協(xié)議實(shí)際上就是一個(gè)分類.列出了一組方法,但是并沒有實(shí)現(xiàn)他們.每個(gè)人都繼承相同的跟對(duì)象,因此非正式分來通常是為跟類定義的.又是非正式協(xié)議又叫做抽象協(xié)議.
聲明分正式協(xié)議的類并不自己實(shí)現(xiàn)這些方法,并且選擇實(shí)現(xiàn)這些方法的子類需要在他的接口部分重新聲明這些方法.同時(shí)還要是實(shí)現(xiàn)這些方法中的一個(gè)或多個(gè),
合成對(duì)象:
你已經(jīng)學(xué)習(xí)了通過派生子類和分類技術(shù)類擴(kuò)展類定義的集中方法.還有一項(xiàng)涉及定義一個(gè)包含其他類的一個(gè)或者多個(gè)對(duì)象的技術(shù).
 
  1.  @interface Square :NSObject 
  2. Rectangle * rect; 
  3. -(int) setSide:(int)s; 
  4. @end 
 
責(zé)任編輯:閆佳明 來源: oschina
相關(guān)推薦

2011-08-04 10:04:17

Objective-C 分類 協(xié)議

2011-08-15 14:32:42

Objective-C委托協(xié)議

2011-08-03 15:51:48

Objective-C 協(xié)議 委托

2011-07-27 16:18:42

Objective-c 協(xié)議

2011-08-10 18:07:29

Objective-C反射

2011-05-11 15:58:34

Objective-C

2013-03-27 12:54:00

iOS開發(fā)Objective-C

2013-06-20 10:40:32

Objective-C實(shí)現(xiàn)截圖

2011-05-11 11:20:26

Objective-C

2014-07-29 09:44:35

2014-11-25 10:18:17

Objective-C

2011-08-22 15:31:35

Objective-C協(xié)議

2011-08-02 13:16:36

Objective-C 語(yǔ)法 函數(shù)

2011-08-04 14:58:37

Objective-C Cocoa NSString

2011-05-11 13:54:08

Objective-C

2011-05-11 15:45:50

內(nèi)存管理Objective-C

2013-08-21 14:57:42

objective-c問題

2011-05-11 14:06:49

Objective-C

2011-08-04 11:15:46

Objective-C 構(gòu)造函數(shù) 構(gòu)造方法

2011-07-25 14:27:10

Objective-C 協(xié)議 函數(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)