2012-10-22 26 views
2

我創建一個協議的方法,我想實現協議方法在多類如何在iPhone中創建全局協議方法?

@protocol XMLProtocol <NSObject> 

- (BOOL) hasAllRequiredAttributes :(NSDictionary*)attributeMap; 

@end 

我已經使用這個下面的類方法

#import "XMLProtocol.h" 
@interface MachineA : NSObject<XMLProtocol> 

及其實現方法,我會實現協議方法

- (BOOL) hasAllRequiredAttributes:(NSDictionary *)attributeMap { 
    return false; 
    } 

並且我還在另一個類中使用此協議方法

#import "XMLProtocol.h" 
@interface MachineB : NSObject<XMLProtocol> 

及其實現方法,我會實現協議方法

- (BOOL) hasAllRequiredAttributes:(NSDictionary *)attributeMap { 
    return false; 
} 

我的想法是我應該在哪裏調用的協議方法。我完全糊塗了。我怎樣才能做到這一點。

+0

你是什麼意思:「我應該在哪裏調用協議方法」? – sergio

+0

@sergio我應該在哪裏啓動協議方法。它的意思是定義協議方法應該怎麼做。 – Ben10

回答

3

的一種方式,你可以定義一個全局實現作爲協議的方法(如果我明白你問正確的)是定義在NSObject的類別:

@implementation NSObject (XMLProtocol) 

- (BOOL) hasAllRequiredAttributes:(NSDictionary *)attributeMap { 
    return false; 
} 

通過做這樣對象將有該方法。不知道這是否合理,但它是一種方式。

另一種方法是定義一個Machine基類,MachineAMachineB從該基類派生;協議方法將在基類中定義:

@interface Machine : NSObject <XMLProtocol> 
    ... 
@implementation Machine 
- (BOOL) hasAllRequiredAttributes:(NSDictionary *)attributeMap { 
    return false; 
} 
    .... 
@end 

@interface MachineA : Machine 
... 

如果需要,任何派生類都可以重新定義它。

這不像NSObject類別那樣「全局」,但是如果您可以爲需要實現該協議的所有類定義基類,它可能是更好的解決方案。

+0

感謝您的回覆 – Ben10

0

即使實現相同,您也必須在兩個類中編寫方法的實現。

0

在你的特殊情況下,通知對你來說是非常有幫助的。除了廣播消息外,通知的工作方式與協議相同。所以你可以在多個班上接到這個電話。

如果你想用協議完成比也很容易。只要確保你當前的視圖控制器被委託引用(即obj.delegate = self)。你可以在視圖上實現這個功能。所以你當前的視圖控制器只會被調用該方法。代表只會在一個地方一次調用一種方法。

0

恕我直言,一個全球性的協議並不是很好的設計,像XML解析一樣具體。

A @protocol本身沒有任何實現部分。它只是一個API定義,把它看成是一個合約。任何符合協議的類都必須實現其強制方法和屬性(有@optional子句)。

例如,您可能有兩個XML解析器的實現,一個在iOS 4中工作,另一個在iOS 5+中工作。兩者均聲明符合XMLProtocol協議。和都實現- (BOOL) hasAllRequiredAttributes :(NSDictionary*)attributeMap;,讓我們想象他們需要以不同的方式實現它。

由於符合XMLProtocol,所以您不必關心實施細節。你知道你將傳遞一個屬性映射,你將獲得一個布爾值,指示它是否具有所有必需的屬性。

你叫你在哪裏都使用這些類的方法:

id <XMLProcotol> parser; 
if (iOS4) { 
    parser = [[OldXMLParser alloc] initWithString:<#...#>]; 
} else { 
    parser = [[NewXMLParser alloc] initWithString:<#...#>]; 
} 
/* you call the method without caring which parser class 
* has been actually created thanks to the protocol 
*/ 
if ([parser hasAllRequiredAttributes:theMap]) { 
    ... 
} 

如果方法的實現是一樣的,你可以既實現了常用的方法共同的父類,存在或子類不在協議中。