非正式協議和合成物件

2021-06-23 04:29:44 字數 1587 閱讀 3212

1.非正式協議(informal protocol):

使用類別category來實現,

非正式協議是nsobject的乙個類別,這樣任何類的物件都可以作為委託物件來使用

,它可以列出物件能夠執行的所有方法,這樣用來實現委託, 我們可以使用選擇器來判斷該非正式協議中是否有這個方法。

非正式協議是nsobject的範疇類,可以認為繼承nsobject的類,當然oc所有的類都繼承於nsobject類,也就說inte***ce定義的類就是非正式協議。寫**就清楚多了

@inte***ce testclass

- (void)helloworld;@end

如果你的.m檔案中沒有實現helloworld這個方法的話,它會出警告,但是程式可以照常執行。

正式協議的關鍵字是protocol,這個感覺要強烈些,但是其實不然,protocol還定義了optional, require,optional型別的可以不用實現這個方法,require型別的函式如果不實現這個方法的話程式會出警告。

@protocol testclass

@optional- (void)helloworld1;

@require

- (void)helloworld2;

@end

現在你可以看一下nsobejct的類,他繼承了nsobject這個正式協議。

@inte***ce nsobject

感覺這兩個區別不大,但是其實不然,protocal存在的乙個重要意義在於:

正式協議(protocal)可以將業務中的方法定義剝離出來,形成乙個單獨的檔案,這跟傳統oo中的提取介面是不謀而合的。

如果遇到二個系統需要交換資料,可以制定一套雙方都遵守的protocol,然後這二個系統中都把這個協議檔案新增到專案中,實現它即可。

這一功能,非正式協議(@inte***ce)就做不到。不信,你可以試試哦。

2.合成物件

已經學習了通過派生子類和分類技術擴充套件類的定義的擊中方式。還有一項技術可以定義乙個類包含其他類的乙個或多個物件,這個新類的物件就是所謂的合成物件。

當建立子類時,必須確保所有被繼承的方法能夠正常使用,因為該類的使用者可以訪問他們。最終子類依賴於父類,改變了父類的有可能會使子類中的方法不能工作。

例如:以前提到,建立乙個長方形(rectangle)類,現在需要建立乙個(square)類,如果讓square繼承rectangle類,那麼square繼承了setwidth:andheight:等方法,但是這並不合適,因為正方形設定邊長只需乙個引數。可以用如下方式:

@inte***ce square: nsobject

-(void) setside :(int) s;

-(int) side ;

-(int) area;

-(int) perimeter;

@end

這樣square中不包含rectangle的方法,但在定義square中的方法時,可以使用rctangle中的方法。例如:

-(int) area

還有個問題就是如果使用這種方式定義square類,那麼就需要為其包含的rectangle物件分配記憶體空間,解決方案就是覆寫init方法或者新增initwithside:之類的新方法來分配空間。

類別,非正式協議,正式協議

類別,非正式協議,正式協議 1類別 1.1 不能新增新的例項變數 1.2 如果一定要在類別中使用例項標量,可以使用全域性變數 關聯 額外變數 注 cocoa中沒有任何真正的私有方法,只要知道物件支援的某個方法名稱,即使.h中沒有宣告,也可以呼叫該方法。個人理解是oc的動態機制 2非正式協議 即建立乙...

非正式協議與正式協議的區別

非正式協議是 類的範疇類 範疇類是語言特徵。通過它,您無需子類化就向某個類增加方法 這意味著幾乎所有的物件都是非正式協議的採納者。非正式協議中的方法不必全部實現。在呼叫某個方法之前,呼叫物件會先檢查目標物件是否實現此方法。在可選協議方法被引入 objective c 2.0 之前,非正式協議實質上是...

Object C非正式協議與正式協議的區別

這兩個概念困擾我很久了,一直都很像搞清楚到非正式協議和正式協議有什麼區別和聯絡,下面結合網上的資料和自己的看法談談這個問題。一 非正式協議 顯然這個名詞是相對於正式協議而言的。在解釋非正式協議之前,先引用兩段話 1 在 cocoa設計模式 第六章類別的6.3.2把類別用於非正式協議一節中,這樣寫到 ...