Имитация интерфейса в Java с целью-C - PullRequest
3 голосов
/ 11 июля 2010

Я пришел из 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);
}

Мне было интересно, возможно ли сделать то же самое с target-c, может быть, с другим синтаксисом.

Я нашел способ объявить протокол

@protocol MyProtocol
-(NSUInteger)someMethod;
@end

тогда мой объект «примет» этот протокол, и в конкретном методе я мог бы написать:

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

Первый вопрос - как убрать предупреждение, но в любом случае другой вызывающий может все же передать неправильный объект классу, поскольку проверка выполняется внутри метода. Можете ли вы указать другой возможный способ для этого?

спасибо Leonardo

1 Ответ

4 голосов
/ 11 июля 2010

Вы можете заставить компилятор выполнять (статическую) проверку за вас.Измените сигнатуру вашего метода на:

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

Это говорит компилятору, что object может быть любого класса, который соответствует MyProtocol.Теперь он будет предупреждать вас, если вы попытаетесь вызвать add: с объектом класса, который не соответствует.

Редактировать:

Чтобы использовать объектычто проще, чем MyProtocol, то полезно MyProtocol расширить NSObject:

@protocol MyProtocol <NSObject>
...
@end

Теперь вы можете отправлять сообщения типа retain, release или respondsToSelector: объектам со статическим типомid <MyProtocol>

Особенно последний полезен в тех случаях, когда в протоколе используется ключевое слово @optional.

...