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
Répondre
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.
Un exemple de cet idiome est '[NSMutableArray arrayWithArray: someArray]' – cobbal
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);
Attention, si quelque chose a une référence à a, cette référence ne sera plus valide. – rpetrich
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.
Ceci est dangereux; tu ne devrais vraiment pas faire ça. – rpetrich