2010-02-13 5 views
2

Dites que j'ai la classe A et la classe B. La classe B est une sous-classe de la classe A. La classe A contient certaines propriétés, puis la classe B étend la super classe A en ajoutant propriétés supplémentaires, spécifiques à cette sous-classe. J'ai créé un objet de classe A et souhaite maintenant convertir l'objet en objet de classe B au moment de l'exécution, afin que je puisse ajouter des données aux propriétés supplémentaires fournies par la classe B. Y at-il un moyen de le faire en Objective-C ? Merci!Convertissez le type d'objet en type d'objet sous-classé dans Objective-C

+0

Ceci est dangereux; tu ne devrais vraiment pas faire ça. – rpetrich

Répondre

3

Pourquoi ne pas vous écrivez un constructeur de classe B qui prend propriétés supplémentaires Une classe comme argument avec Requise par classe B.

Pourquoi ne créez-vous pas seulement une classe B en premier lieu? Cela semble un peu étrange que vous vouliez le faire. Peut-être pouvez-vous nous donner des détails plus concrets sur les classes A et ce que vous faites avec eux.

+1

Un exemple de cet idiome est '[NSMutableArray arrayWithArray: someArray]' – cobbal

1

Vous ne pouvez pas le convertir en place car une instance de classe B est plus grande qu'une instance de classe A (en supposant que les propriétés supplémentaires sont stockées dans ivars). Objective-C n'a pas la possibilité de déplacer des objets.

Si vous êtes heureux de faire une copie de l'objet (c.-à-vous êtes sûr de ou peuvent les mettre à jour, il n'y a pas de références), vous pouvez faire quelque chose comme ça avec le Objective-C runtime functions:

newB = object_copy(a, class_getInstanceSize(B)); 
object_setClass(newB, B); 
object_dispose(a); 
+0

Attention, si quelque chose a une référence à a, cette référence ne sera plus valide. – rpetrich

0

La façon la plus simple est de remplacer alloc la classe a à la classe B. retourner effectivement

@implementation ClassA (MyCategory) 

+ (id)alloc 
{ 
    if (self != [ClassB class]) 
     return [ClassB alloc]; 
    return [super alloc]; 
} 

@end 

Bien sûr, ce fait est généralement une très mauvaise idée.