Objective-C 學習筆記 – part 4 – 協議

來源:互聯網
上載者:User

**以下內容中 interface 指代傳統意義上的介面, 而@interface 指代 Objective-C 中的類型規範概念,以免混亂。

看到這一章,有點奇怪,其實只要將 protocal 當作 C# 裡面的介面來認識就好了。

因為 Objective-C 給每個 Class 都分配了一個 @interface ,因此用這人概念來表達 interface 的意思。

抽象出介面的目的:

1. 相似方法組的實現有共同的規範。
2. 讓“介面”獨立於類。
3. 封裝沒有繼承關係的類的共性。

if ( [assistant respondsToSelector:@selector(helpOut:)] ) {
    [assistant helpOut:self];
    return YES;
}
return NO;

上面的代碼是不是可以認為使用”反射“確定了一個對象是否支援一個方法調用。

但是 protocal 比 interface 強大的地方在於,它是可以跨應用程式的,這也是之所以叫它 protocal 的原因。

事實上,將“方法調用”都轉換為訊息傳遞本身就是弱化了應用程式定義域的概念,讓多個程式可以無縫地工作在一起,在這一點上蘋果確實是很高明的。

匿名類也可以利用 protocal 來與外界溝通而無需定義與之對應的 @interface。

如何申明一個 protocal:
@protocol ProtocolName
method declarations
@end

需要注意,協議不象類名稱一樣全域可見,它只存於作用的命名空間中。

協議用的方法可以申明為 option 方式(可選/非強制方式)

非正式的協議使用 @interface 來申明,如:
@interface NSObject ( MyXMLSupport )
- initFromXMLRepresentation:(NSXMLElement *)XMLElement;
- (NSXMLElement *)XMLRepresentation;
@end

與類對應的 @interface 不一樣的是,非正式協議沒有對應的實現檔案,即只有一個空的協議在那裡,可以認為它是用來標定一類有相似行為的類的分組方法。

非正式協議沒有編譯時間的類型檢查,如果需要類型檢查,應該使用正式協議。

非正式協議常用於所有方法都是可選時的情形,但對於 OS X > 10.5 最好使用正式協議。

關於協議對象:

正式協議是一種特殊的資料類型:它閃是 Protocal 的執行個體而非一般對象是 Class 的執行個體。

運行時只初化有引用的 @protocal

關於採用一個協議;

不論正式或非正式協議都使用下面的文法來申明:
@interface ClassName : ItsSuperclass < protocol list >

使用多個協議的情況:
@interface Formatter : NSObject < Formatting, Prettifying >

使用協議的類需要 include 協議所在的 .h 檔案,並且協議中的方法不義定義在 類型自己的@interface 中,這樣來避免重複。

一個類可以沒有對應的 @interface 而只有 protocal

可以使用下面的測試方法來檢查一個對象是否遵守某個 protocal:
if ( ! [receiver conformsToProtocol:@protocol(MyXMLSupport)]  )

如果只需要檢查一個特定方法的話,盡量使用 respondsToSelector: test 從則避免檢測 protocal 中的所有方法。

協議可以繼承

由於協議可以互相引用, 因此在某些情況下不需要 import 協議所在的檔案,而只需要象這樣:
@protocol B;
@protocol A
- foo:(id <B>)anObject;
@end

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.