【问题标题】:Simulate interface in java with objective-c用objective-c在java中模拟接口
【发布时间】:2010-07-11 12:52:40
【问题描述】:

我来自 java 背景,我尝试使用类似 java 接口的协议。

在java中,你可以让一个对象实现一个接口并将它传递给这样的方法:

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 MyProtocol
-(NSUInteger)someMethod;
@end

然后我的对象将“采用”该协议并以我可以编写的特定方法:

-(int) add:(NSObject*)object {
 if ([object conformsToProtocol:@protocol(MyProtocol)]) {
   // I get a warning
   [object someMethod];
 } else {
   // other staff
 }
}

第一个问题是如何删除警告,但在任何情况下,其他调用者仍可能将错误的对象传递给类,因为检查是在方法内部完成的。 你能指出一些其他可能的方法吗?

谢谢 莱昂纳多

【问题讨论】:

    标签: java objective-c interface protocols


    【解决方案1】:

    您可以让编译器为您进行(静态)检查。将您的方法签名更改为:

    -(int) add:(id<MyProtocol>)object
    

    这告诉编译器,object 可以是任何符合MyProtocol 的类。如果您尝试使用不符合的类的对象调用 add:,它现在会警告您。

    编辑:

    为了更容易使用符合MyProtocol 的对象,让MyProtocol 扩展NSObject 会很有帮助:

    @protocol MyProtocol <NSObject>
    ...
    @end
    

    现在您可以向静态类型为id &lt;MyProtocol&gt; 的对象发送retainreleaserespondsToSelector: 等消息

    尤其是在协议中使用@optional 关键字的情况下,最后一个很有帮助。

    【讨论】:

    • 太棒了,这似乎可行,但是我在网上收到了编译器警告:if ([object conformsToProtocol:@protocol(MyProtocol)]) 说对象不响应conformsToProtocol。如果我将方法签名 id,这似乎消失了,我对使用哪个感到有点困惑
    • 您不必通过conformsToProtocol 进行测试。如果您尝试 add: 一个不符合 MyProtocol 的对象,编译器会警告您。因此,如果您注意所有警告,则可以保证始终传递符合协议的对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多