Objective-C的。你能使用像Java接口这样的协议吗?

时间:2009-06-18 02:52:51

标签: java objective-c

这些基本上是一回事吗?

例如,如果我有一个Java接口

public interface CoolObject{
 ...
}

我可以使用在CoolObject作为参数的函数中实现CoolObject接口的任何对象:

public void foo(CoolObject o) {
...
}

在Objective-C中是否相同?

@protocol CoolProtocol
...
@end

@interface Foo: NSObject <CoolProtocol>
...
@end

(void) - someMethod: (CoolProtocol *) obj {
}

上述工作(并被认为是正确的吗?)

感谢您的时间。如果您需要我澄清我的问题,请告诉我。

2 个答案:

答案 0 :(得分:34)

关闭。在Objective C中,您指出一个对象实现了一个带有尖括号&lt;&gt;的协议,因此您可以像下列其中一个一样编写您的方法:

- (void) someMethod: (id <CoolProtocol>) obj { }
- (void) someMethod: (id <NSObject, CoolProtocol>) obj { }
- (void) someMethod: (NSObject <CoolProtocol> *) obj { }

在所有情况下,你都说someMethod需要一个实现CoolProtocol的对象。

id是指向任何类型的Objective C对象的通用指针。

所以id&lt; CoolProtocol&GT;表示“任何实现CoolProtocol的客观C对象”。

通常,您希望能够保留/释放/自动释放对象,并且通常将其视为常规Cocoa对象,因此通常也可以添加NSObject协议,这是第二种情况。

如果你想确保它实际上是一个合适的Cocoa对象(不包括基于NSProxy的对象),那么你可以使用最后一个表单,它基本上说“我想要任何实现CoolProtocol的真正Cocoa Objective C对象”。

答案 1 :(得分:14)

彼得斯的答案很棒。我想补充一点。如果将“NSObject”协议添加到协议

@protocol CoolProtocol <NSObject>
@end

这将减少您在方法声明中声明NSObject协议的需要。

- (void) someMethod: (id <NSObject, CoolProtocol>) obj { }

现在变成

 - (void) someMethod: (id <CoolProtocol>) obj { }