我有 java 背景,我正在尝试像 java 接口(interface)一样使用协议(protocol)。
在 java 中,你可以让一个对象实现一个接口(interface)并将它传递给这样的方法:
public interface MyInterface {
void myMethod();
}
public class MyObject implements MyInterface {
void myMethod() {// operations}
}
public class MyFactory {
static void doSomething(MyInterface obj) {
obj.myMethod();
}
}
public void main(String[] args) {
// get instance of MyInterface from a given factory
MyInterface obj = new MyObject();
// call method
MyFactory.doSomething(obj);
}
我想知道是否可以用 objective-c 做同样的事情,也许用其他语法。
我找到的方法是声明一个协议(protocol)
@protocol MyProtocol
-(NSUInteger)someMethod;
@end
然后我的对象将“采用”该协议(protocol),并在我可以编写的特定方法中:
-(int) add:(NSObject*)object {
if ([object conformsToProtocol:@protocol(MyProtocol)]) {
// I get a warning
[object someMethod];
} else {
// other staff
}
}
第一个问题是如何删除警告,但无论如何其他调用者仍可能将错误的对象传递给类,因为检查是在方法内部完成的。 你能指出一些其他可能的方法吗?
谢谢 莱昂纳多
最佳答案
您可以让编译器为您进行(静态)检查。将您的方法签名更改为:
-(int) add:(id<MyProtocol>)object
这告诉编译器,object
可以是符合 MyProtocol
的任何类别.如果您尝试调用 add:
,它现在会警告您使用不符合的类的对象。
编辑:
使用符合 MyProtocol
的对象更容易,这很有帮助 MyProtocol
扩展 NSObject:
@protocol MyProtocol <NSObject>
...
@end
现在您可以发送类似 retain
的消息, release
或 respondsToSelector:
静态类型为 id <MyProtocol>
的对象
特别是最后一个在您使用 @optional
的情况下很有帮助协议(protocol)中的关键字。
关于java - 用objective-c在java中模拟接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3223092/