2010-12-04 4 views
2

I ont créé 2 objets sous-classe de NSObjectdifférents objets de type comme paramètre d'une fonction

AObject, BObject

Est-il possible de transférer des variables de ces 2 objets à une même fonction?

tels que

-(void)myFunction:(AObject *)obj; 

-(void)myFunction:(BObject *)obj; 

Je l'ai testé dans Xcode, il est interdit. Y a-t-il une méthode de remplacement?

Bienvenue tout commentaire

Merci InterDev

Répondre

2

Il y a plusieurs options. Voici quatre qui viennent à l'esprit, chacun avec leurs propres avantages et les inconvénients:

  1. preuve de discrimination par signature:

    - (void)myFunctionWithA:(AObject *)obj; 
    - (void)myFunctionWithB:(BObject *)obj; 
    
  2. Déclarez un paramètre de type NSObject * (ou id, comme suggéré dans les commentaires) et interrogez le type à l'intérieur de la fonction.

  3. Comme ci-dessus, mais la contraindre en déclarant une classe de base commune BaseObject *, dont AObject et BObject Hériter.
  4. Combine la classe de base avec une technique de trampoline:

    - (void)myFunction:(BaseObject *)base { 
        [base myTrampoline:self]; 
    } 
    

    BaseObject déclare la méthode abstraite myTrampoline:, qui AObject et BObject mettre en œuvre.

Sans en savoir plus sur votre problème, il est impossible de dire lequel est le meilleur.

+0

Merci. Je choisis 2. – arachide

+1

Personnellement j'utiliserais id au lieu de NSObject *, me sens plus naturel ... – gcamp

+0

@gcamp Je le ferais en second. D'autant plus que tous les objets Objective-C ne sont pas 'NSObject *' (certains sont également 'NSProxy *', bien que cela soit relativement rare). Considérant que 'id' est un synonyme de' struct objc_object * ', qui fonctionne pour n'importe quel objet. Peu importe beaucoup, cependant. –

1

Il a été suggéré de taper simplement votre paramètre en tant que id, mais si vous vous sentez impressionnant, vous pouvez demander à la compilation de vérifier que votre objet sera capable de faire ce dont vous avez besoin: utilisez un protocole.

@protocol DoingSomething <NSObject> 
// whatever methods you intend to call on the parameter of that one method 
@end 

//... 
- (void)myFunction:(id<DoingSomething>)param { 
    // only send messages to param that are in <DoingSomething> and <NSObject> 
} 
//... 
Questions connexes