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.
- 1. Convertissez System.Drawing.Image en System.Windows.Controls.Image?
- 2. Combine chaîne en ObjectiveC
- 3. Convertissez twoplustwo.com en flux RSS?
- 4. en réglant par programme le `type` d'un type abstrait
- 5. Obtenez le type en flex
- 6. Expression.Constant (valeur, type) type est inconnu. Comment définir le type
- 7. Analyseur AMF0 dans ObjectiveC
- 8. Obtenir type de type générique dans une liste en Java
- 9. type dans l'assemblage en ligne
- 10. Changer le type de contrôle par type
- 11. Comparer type fermé avec le type ouvert
- 12. Possible d'obtenir le type d'un type d'alias dans C#?
- 13. Le type <type> existe dans les deux DLL
- 14. Générique Type dans le constructeur
- 15. Terminer le type dans FlexBuilder?
- 16. Comment spécifier le type d'identificateur d'un type générique (pour les requêtes db) avec le type générique
- 17. le type de données « char » en java
- 18. Détecter le type MIME en PHP
- 19. Gérer le type d'exception spécifique en python
- 20. .htaccess en ajoutant le type de php
- 21. Modifier le type d'octet python en chaîne
- 22. spécifier le type Dynamiquement en C#
- 23. Activer le type de classe en C#
- 24. CS0012: Le type 'System.Xml.IXmlLineInfo'
- 25. Modifier le type d'entrée
- 26. Obtenir le type de fichier en Mono
- 27. méthode générique en Java, déterminer le type
- 28. Comment obtenir le type d'exception en C#
- 29. typedef en équivalence c et le type
- 30. Personnalisation de writeToFile dans ObjectiveC
Ceci est dangereux; tu ne devrais vraiment pas faire ça. – rpetrich