协议作为方法参数

时间:2012-08-13 09:52:57

标签: objective-c

我想要一个方法来访问在单个类中声明的方法的子集。显然,这可以通过协议来实现。

方法子集在HouseProtocol中声明,而类House实现其方法。

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

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

在另一个类的其他地方,使用HouseProtocol参数定义了一个方法:

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

此方法应使用house的方法,但只能使用HouseProtocol中可访问的方法。含义方法foo但不是方法栏。

以上是否正确,如何在某些方法中调用foo方法?工作代码赞赏。

1 个答案:

答案 0 :(得分:8)

这是对的。 hp上的调用方法照常工作:

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

请注意,如果您真的不需要协议(例如,如果代码非常简单并且编写协议会显然过度),您只需使用id类型:

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

在这种情况下唯一的问题是编译器必须知道-foo存在。

从问题标题判断,让您感到困惑的是您对hp变量类型的看法 - id<HouseProtocol>不是协议,它是“实现HouseProtocol的东西”。这就是为什么你可以用通常的方式调用hp上的方法,因为它只是某种对象。