4

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

方法子集在 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 但不是方法栏。

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

4

1 回答 1

8

这是对的。hp像往常一样调用方法:

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

请注意,如果您真的不需要该协议(例如,如果代码非常简单并且编写协议显然是多余的),您可以简单地使用以下id类型:

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

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

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

于 2012-08-13T09:57:04.297 回答