2011-12-23 3 views
0

J'ai une classe avec une variable d'instance d'un NSArray d'objets différents dont je sais qu'ils doivent hériter de la même super-classe. Ma question est de savoir comment accéder aux variables d'instance et aux méthodes d'une autre classe (son contrôleur) tout en s'assurant que le contenu du tableau ne contient que des objets qui sont une sous-classe d'une certaine classe. J'ai essayé d'implémenter un protocole minimal et de refencer les objets dans le tableau comme type id et (id *) mais cela ne me permettra pas d'accéder aux variables d'instance ou aux méthodes des classes dans le tableau (et à juste titre). Dans le fichier objetAccès aux instances de sous-classes

NSArray* components; // contains subclasses of component 

Dans le fichier du contrôleur

subclassofClassObject* object; 

est-il une fonction SubClassOf, macro, typedef ... etc ou une solution que je puisse référencer les sous-classes de composant dans une sous-classe de objet d'une sous-classe de contrôleur. c'est quelque chose à remplacer subclassofClass.

+1

Etes-vous sûr que vous avez besoin de variables de type 'id *'? Ce serait un pointeur sur un 'id', qui est déjà un pointeur vers un objet Cocoa tout seul. – Monolo

Répondre

0

Je ne suis pas tout à fait ce que vous demandez, mais peut-être ce qui suit aiderai:

Vous pouvez déterminer si vous avez une instance d'une classe, ou un de ses sous-classes à l'aide isKindOfClass:. Par exemple donné une classe MyBaseClass, utilisez un casting:

id elem = [components objectAtIndex:ix]; 
if ([elem isKindOfClass:[MyBaseClass class]]) 
{ 
    // elem is an instance of MyBaseClass or one of its subclasses so cast is safe 
    MyBaseClass *mbc = (MyBaseClass *)elem; 
    // now can access methods, properties and public instance variables 
    // of MyBaseClass via mbc without warnings 
    ... 
} 
+0

Veuillez respecter les conventions et commencer les noms de classe avec des majuscules (et les noms de méthodes avec des lettres minuscules) :-) – DarkDust

+0

Ahh ... Casting. J'ai oublié cela. Très utile, merci. – Nicholas

2

Je vous suggère de réfléchir à la conception de votre première architecture. Vous pouvez essayer de déplacer votre logique dans votre implémentation de sous-classes:

@interface BaseClass: NSObject { 
} 
... 
- (void) doMySuperImportantStuff: (id)data; 
@end 

@implementation BaseClass 
... 
- (void) doMySuperImportantStuff: (id)data 
{ 
    // basic implementation here, or common actions for all subclasses 
    NSLog(@"BaseClass is here"); 
} 
@end 


@interface ClassA: BaseClass 
{ 
NSInteger i; 
} 
... 
@end 

@implementation ClassA 
... 
- (void) doMySuperImportantStuff: (id)data 
{ 
    // some specific stuff 
    NSLog(@"ClassA is here, i=%d", i); 
} 
@end 


@interface ClassB: BaseClass 
{ 
    NSString *myString; 
} 
... 
@end 

@implementation ClassB 
... 
- (void) doMySuperImportantStuff: (id)data 
{ 
    // another specific stuff 
    NSLog(@"ClassB is here, myString = %@", myString); 
} 
@end 

// client code example 
.... 
NSArray *list = ...; // list of instances of the subclasses from BaseClass 
for(BaseClass *item in list) { 
    [item doMySuperImportantStuff: userData]; 
}