2010-07-11 4 views
3

Je viens d'un arrière-plan java, et j'essayais d'utiliser un protocole comme une interface java.Simulation de l'interface dans Java avec objectif-c

En Java, vous pouvez avoir un objet de mettre en œuvre une interface et passer à une méthode comme ceci:

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); 
} 

Je me demandais s'il est possible de faire la même chose avec Objective-C, peut-être avec d'autres syntaxe.

La façon dont j'ai trouvé est de déclarer un protocole

@protocol MyProtocol 
-(NSUInteger)someMethod; 
@end 

alors mon objet serait « d'adopter » ce protocole et une méthode spécifique que je pourrais écrire:

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

La première question serait comment supprimer l'avertissement, mais dans tous les cas, un autre appelant peut toujours transmettre un mauvais objet à la classe, puisque la vérification est effectuée dans la méthode. Pouvez-vous indiquer d'autres moyens possibles pour cela?

grâce Leonardo

Répondre

4

Vous pouvez faire le compilateur faire le (statique) de vérifier pour vous. Modifier vous signature de la méthode à:

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

qui indique au compilateur que object peut être de toute classe qui est conforme à MyProtocol. Il vous avertira si vous essayez d'appeler add: avec un objet d'une classe non conforme.

Edit:

Pour faire usage des objets qui sont conformes aux MyProtocol plus facile, il est loué utile MyProtocol étendre NSObject:

@protocol MyProtocol <NSObject> 
... 
@end 

Maintenant, vous pouvez envoyer des messages comme retain, release ou respondsToSelector: aux objets avec un type statique de id <MyProtocol>

Surtout le dernier est utile dans les cas où vous utilisez le mot-clé @optional dans le protocole.

+0

super, cela semble fonctionner, mais j'ai reçu un avertissement de compilateur en ligne: if ([objet conformeToProtocol: @protocol (MyProtocol)]) disant que l'objet ne répond pas à conformsToProtocol. Cela semble disparaître si je remplace dans la signature de la méthode id , je suis un peu confus sur lequel utiliser – Leonardo

+2

Vous ne devez pas tester par 'conformsToProtocol'. Si vous essayez d'ajouter un objet qui n'est pas conforme à MyProtocol, le compilateur vous avertit. Donc, ** si vous prenez soin de tous les avertissements **, il est garanti que toujours un objet conforme au protocole est passé. – Yuji

+0

@Leonardo: Voir modification. –