java - 用objective-c在java中模拟接口(interface)

标签 java objective-c interface protocols

我有 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 的消息, releaserespondsToSelector:静态类型为 id <MyProtocol> 的对象

特别是最后一个在您使用 @optional 的情况下很有帮助协议(protocol)中的关键字。

关于java - 用objective-c在java中模拟接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3223092/

相关文章:

c# - 可以强制开发人员处理特定的异常吗?

java - 变量值显示为 null

java - Android开发-OnTouchListener-如何使用?

java - 是否有 Math.floorDiv(a, b),但用于 BigInteger?

objective-c - 未在 setStringValue 上调用 ControlTextDidChange

objective-c - Objective-C 类型的 Swift 2 协议(protocol)扩展和一致性

iphone - 如何在iPhone的UILocalNotification中更改自定义声音?

java - Java.util.Map接口(interface)的父类是哪个?

java - 包含二维双数组用户输入的对象

java - Java中二维数组的声明和格式