Conforming to a Protocol(遵守協議)

翻譯自:Objective-C Runtime Programming Guide   chapter 4

如果一個類採納一個協議,或是,這個類繼承採納了一個協議的類,那這個類就是遵守這個協議。(譯註:真繞舌)這個類的實例也被稱為遵守它所屬的類所遵守的那一組協議。

譯註:參考下例,ClassA被稱為遵守protocolA、protocolB...etc

@interface  ClassA : SuperClassA < protocolA, protocolB, .... >

譯註:下例中,如果SuperClassB採納一個協議protocolX,那ClassB也是遵守協議ProtocolX。

@interface  ClassB : SuperClassB

因為類必須實作所有它所採納的協議中的required方法,也可以說遵守一個協議的類或是實例就等同於說在它的清單中有所有該協議所宣告的方法。(譯註:你可以將遵守某個協議的類或是實例看成它也擁有該協議所宣告的方法,這邊原文是說,類的方法和類遵守的協議的方法都可以看成在類的方法清單裡面)。

譯註:

遵守某個協議rprotocol的類的表頭檔為:
@interface  ClassA : SuperClassA < protocol >
{.....instances....}
method1;
method2;
....
@end

protocol的表頭檔為:
@protocol
methodA;
methodB;
...
@end

可以看成ClassA的方法清單中有協議protocol的方法methodA和methodB等等。

也可以檢查一個物件是否遵守某個協議,使用conformsToProtocol:訊息。

if ( ! [ receiver conformsToProtocol:@protocol(MyXMLSupport) ] ) {
// 物件不遵守MyXMLSupport協議
// 如果你期望receiver實作宣告在MyXMLSupport裡面的方法的話,這可能會有錯誤

(注意,有一個同名的類方法,conformsToProtocol: )

conformsToProtocol: 測試就像是對於單一方法的respondsToSelector:測試,除了它是測試協議是否已經被採納(並且假定它宣告的所有方法都被實作了)而不只是一個特定的方法被實作了沒。因為它是檢查所有在協議中的方法,所以conformsToProtocol:比respondsToSelector:更有效率。

conformsToProtocol:測試也像isKindOfClass:測試,除了它是協議類型(type based on protocol)而不是繼承層類型(type based on inheritance hierarchy)的測試。

譯註:
conformsToProtocol:  測試是否遵守某個協議,若有,那就假定協議中的方法都被實作了 (協議)
respondsToSelector:  只有測試是否能響應特定方法 (方法)
isKindOfClass:  基於繼承層類型的測試 (類)

留言