cast d'une classe héritée vers une classe parent

Philippe49Philippe49 Membre
décembre 2007 modifié dans API AppKit #1
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 ?


Réponses

  • psychoh13psychoh13 Mothership Developer Membre
    18:49 modifié #2
    Je suis désolé mais ce n'est pas possible à  priori. Il faut que cela soit définit dans la classe elle-même. C'est-à -dire que tu peux faire une méthode dans une catégorie qui te crée un objet de la classe parente à  partir des informations de la classe fille.

    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".
  • Philippe49Philippe49 Membre
    18:49 modifié #3
    dans 1197200003:

    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.
  • psychoh13psychoh13 Mothership Developer Membre
    18:49 modifié #4
    Avec l'héritage tu peux même en faire une catégorie de NSDate :
    @interface NSDate (PSYBasicDateCreation)<br /><br />- (NSDate *)basicDateCopy;<br /><br />@end<br /><br />@implementation NSDate (PSYBasicDateCreation)<br /><br />- (NSDate *)basicDateCopy<br />{<br />	return [NSDate dateWithTimeIntervalSince1970:[self timeIntervalSince1970]];<br />}<br /><br />@end
    


    Il ne faut jamais oublier l'héritage en programmation orienté-objet.
Connectez-vous ou Inscrivez-vous pour répondre.