cast d'une classe héritée vers une classe parent
Philippe49
Membre
Suite au post sur les NSDate/NScalendarDate, je me pose le problème suivant :
Deux classes sont définies dont l'une hérite de l'autre
@interface A : NSObject
{
}
@end
@interface B : A
{
}
@end
Une instance de la classe héritée est définie. Je veux créer une instance de la classe parent, conservant de l'instance B tout ce qui peut être conservée.
B * object;
A * bestCopyOfObject;
Comment faire à la meilleure économie ?
Deux classes sont définies dont l'une hérite de l'autre
@interface A : NSObject
{
}
@end
@interface B : A
{
}
@end
Une instance de la classe héritée est définie. Je veux créer une instance de la classe parent, conservant de l'instance B tout ce qui peut être conservée.
B * object;
A * bestCopyOfObject;
Comment faire à la meilleure économie ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
De toutes façons, il faut bien comprendre que la copie d'un objet c'est simplement la création d'un nouvel objet auquel on donne les mêmes informations que l'objet copié. À partir de là tu fais ce que tu veux.
Quand j'ai dit qu'il fallait que la classe définisse ce comportement, certaines classes le définit bel et bien. L'exemple le plus frappant ce sont les classes qui ont des objets modifiables et non-modifiables.
Par exemple, NSString et NSMutableString adoptent le protocole NSCopying et NSMutableCopying, et là si tu envoies le message -copy à une NSString ou une NSMutableString tu obtiendras nécessairement une NSString, et si tu envoies le message -mutableCopy à une NSString ou une NSMutableString tu obtiendras une NSMutableString.
Bien sûr il s'agit là d'un comportement bien spécifique, mais rien ne t'empêche à priori de définir une méthode dans une catégorie qui créera un nouvel objet de la super-classe (ou même de la sous-classe, ou même de n'importe quelle classe) qui contiendra "un maximum d'information de la classe d'origine".
une méthode comme
-(NSDate*) copyAsNSDate;
dans une catégorie de NSCalendarDate
mais comment, c'est cela mon problème.
Il ne faut jamais oublier l'héritage en programmation orienté-objet.