2012-08-13 109 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