2012-08-13 110 views
4

我想要一個方法來訪問單個類中聲明的方法子集。顯然這可以通過協議來實現。作爲方法參數的協議

方法子集在HouseProtocol中聲明,而House類實現它的方法。

@protocol HouseProtocol <NSObject> 
-(void) foo; 
@end 

@interface House : NSObject <HouseProtocol> 
-(void) foo; 
-(void) bar; 
@end 

別的地方在另一個類的方法定義採取HouseProtocol說法:

-(void) somemethod:(id<HouseProtocol>)hp; 

這種方法應該用房屋的方法,但只有那些在訪問HouseProtocol。含義方法foo而不是方法欄。

以上是否正確,以及some method中調用的foo方法如何?工作代碼讚賞。

回答

8

這是正確的。呼籲hp作品常用的方法:

- (void) somemethod: (id<HouseProtocol>) hp 
{ 
    [hp foo]; 
} 

需要注意的是,如果你並不真正需要的協議(例如,如果代碼是非常簡單的,寫一個協議,將明確矯枉過正),你可以簡單地使用id類型:

- (void) somemethod: (id) hp 
{ 
    [hp foo]; 
} 

在這種情況下,唯一的缺點是,編譯器必須知道-foo存在。

從問題標題來看,您感到困惑的是您如何看待hp變量的類型 - id<HouseProtocol>不是協議,而是「實現HouseProtocol的東西」。這就是爲什麼你可以用通常的方式調用hp的方法,因爲它只是某種對象。

+3

看起來似乎過度殺傷,但它可以作爲良好的文件,使意圖更清晰 – 2012-08-13 10:09:45

+1

同意。我只提到了選項清晰的可能性,在大多數情況下,我也會選擇明確的協議。 – zoul 2012-08-13 11:12:15

+0

謝謝你的回答。 foo沒有被叫,因爲惠普是零... – user1594959 2012-08-14 07:31:27