Caster une classe mère en sa fille [Résolu]

Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 21 nov. 2013 à 21:42 - Dernière réponse : Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention
- 24 nov. 2013 à 06:58
Bonsoir,

j'ai ce type de classes
    /// <summary>
    /// Ma classe mère qui décrit un phénomène
    /// </summary>
    class ClassMere
    {
        public string Description { get; set; }

        public int ID { get; set; }

        //........
    }

    /// <summary>
    /// Ma classe fille qui donne la durée d'un phénomène.
    /// </summary>
    class ClasseFille : ClassMere
    {

        public TimeSpan Duree { get; set; }
    }



A un moment donné, je me retrouve avec une liste de mères et j'aimerai en faire une liste de filles

            ClassMere maMere = new ClassMere();

            ClasseFille fille = (ClasseFille)maMere;

Ceci compile mais lève une exception à l'exécution "Impossible d'effectuer un cast d'un objet de type 'test.ClassMere' en type 'test.ClasseFille'."

Alors je tente une conversion implicite
        public static implicit operator ClasseFille(ClassMere mamam)
        {
            ClasseFille f = new ClasseFille();
            f.Description = mamam.Description;
            f.ID = mamam.ID;
            //...

            return f;
        }

Là ça ne compile pas: 'test.ClasseFille.implicit operator test.ClasseFille(test.ClassMere)' : les conversions définies par l'utilisateur vers ou d'une classe de base ne sont pas autorisées
Idem pour explicit évidement.

Donc au final, je me retrouve avec ça:
        public static ClasseFille Convertit(ClassMere mamam)
        {
            ClasseFille f = new ClasseFille();
            f.Description = mamam.Description;
            f.ID = mamam.ID;
            //...

            return f;
        }



Ca marche, mais je ne trouve pas ça beau, il faut qu'à chaque fois ou je voudrais cette conversion j'utilise la méthode static.
D'autre part (et c'est aussi vrai pour implicit et explicit), je suis obligé de transférer tous les champs de mère vers fille, et quand il y en a beaucoup c'est un peu case pied, alors que je les ai déjà tout prêts et emballés.

Quelqu'un sait il faire mieux?

Merci d'avance.

Penser aux balises de coloration syntaxique: bouton <>, préciser le langage :<code csharp>.
Quand la solution est trouvée, mettre la discussion Résolue.
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
NHenry 14278 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 21 octobre 2018 Dernière intervention - 21 nov. 2013 à 22:16
3
Merci
Bonsoir,

Sans trop connaitre Java :
ClassMere maMere = new ClassMere();
ClasseFille fille = (ClasseFille)maMere;

Ne peut pas fonctionner, car ClasseMere n'est pas une ClasseFille
Mais :
ClasseFille maFille = new ClasseFille();
ClassMere mere = (ClassMere)maFille ;
Fonctionnera car ClasseFille est une ClasseMere

(Sauf erreur de ma part).

Merci NHenry 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

KX 15785 Messages postés samedi 31 mai 2008Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 22 nov. 2013 à 07:51
"Sans trop connaitre Java"
D'autant que ça n'en est pas ;-)

En C# on devrait faire :

if (mere is ClasseFille)
{
    ClasseFille fille = (ClasseFille) mere;
}

Mais typiquement il y a un problème dans ta hiérarchie de classes, il n'y a pas de raison quand on parle d'une personne que la mère soit une superclasse de la fille, en fait ce serait plutôt le contraire, car toutes les mères sont d'abord des filles, alors que toutes les filles ne sont pas mères...
NHenry 14278 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 21 octobre 2018 Dernière intervention - 22 nov. 2013 à 13:44
"Sans trop connaitre Java"
D'autant que ça n'en est pas ;-)


On en peut même plus ne pas être réveiller ? :)
Commenter la réponse de NHenry
Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 22 nov. 2013 à 18:51
0
Merci
Merci à tous les deux, ça confirme mon blocage.
Le fait est qu'aucune de mes mères ne sont initialisées comme des filles.
Je continuerai donc à me coder la copie de tous les champs.

C'est un cas qui se présente pour la seconde fois pour moi.

Et la première fois, un champ a été ajouté à la classe mère, mais la copie oubliée pour le cast de mère en fille, et du coup dans mes filles le champ était vide.
J'ai mis longtemps à comprendre.

C'était pour éviter de me refaire avoir.

KX 15785 Messages postés samedi 31 mai 2008Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 22 nov. 2013 à 19:03
Ce que tu décris c'est un problème de conception dans ta hiérarchie de classe.

Evidemment on oubliera ma remarque de ce matin, je croyais que tes classes décrivaient des personnes (je plaide, comme NHenry, le manque de réveil)

Tu peux peut-être décrire plus précisément ce que tu voulais faire, pour te dire comment tu aurais pu faire mieux. Parce que clairement "coder la copie de tous les champs" n'est pas correct...
Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 22 nov. 2013 à 19:46
problème de conception
oui et non, j'ai une table de phénomène et un calendrier, quand un phénomène se présente j'enregistre sur le calendrier, la date et l'heure de début et de fin dans une instance de la classe fille.
Et donc en attendant de trouver mieux, je copie tous les champs de la mère dans la fille.
KX 15785 Messages postés samedi 31 mai 2008Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 22 nov. 2013 à 20:32
J'avoue ne pas connaître trop le C#, je suis plutôt Java, mais à la syntaxe près c'est kif kif, donc le mieux c'est que je l'écrive correctement en Java et tu traduiras après en C# plutôt que je fasse du pseudo C# que personne ne comprendrait...

En gros :

public class Phenomene
{
    private int id;
    private String description;

    public Phenomene(int id, String description)
    {
        this.id = id;
        this.description = description;
    }
    
    public Phenomene(Phenomene phenomene)
    {
        this.id = phenomene.id;
        this.description = phenomene.description;
    }

    public int getId()
    {
        return id;
    }

    public void setId(int id)
    {
        this.id = id;
    }

    public String getDescription()
    {
        return description;
    }

    public void setDescription(String description)
    {
        this.description = description;
    }
}

public class PhenomeneParticulier extends Phenomene
{
    private String detail;

    public PhenomeneParticulier(Phenomene phenomene, String detail)
    {
        super(phenomene);
        this.detail = detail;
    }

    public PhenomeneParticulier(PhenomeneParticulier particulier)
    {
        super(particulier);
        this.detail = particulier.detail;
    }

    public String getDetail()
    {
        return detail;
    }

    public void setDetail(String detail)
    {
        this.detail= detail;
    }
}

public class PhenomeneConversion
{
    public static Phenomene fromParticulier(PhenomeneParticulier particulier)
    {
        return new Phenomene(particulier);
    }

    public static PhenomeneParticulier toParticulier(Phenomene phenomene)
    {
        return new PhenomeneParticulier(phenomene, null);
    }
}
Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 22 nov. 2013 à 20:39
Et ben, je regarde ça lundi.
Merci
Commenter la réponse de Whismeril
Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 23 nov. 2013 à 20:11
0
Merci
Bonsoir, j'ai eu un peu de temps pour regarder ton code, traduit en C# ça donne ça:
    /// <summary>
    /// Ma classe mère qui décrit un phénomène
    /// </summary>
    class ClassMere
    {
        public ClassMere(ClassMere Acloner)
        {
            this.Description = Acloner.Description;
            this.ID = Acloner.ID;
            //.....
        }


        public string Description { get; set; }

        public int ID { get; set; }

        //........
    }

    /// <summary>
    /// Ma classe fille qui donne la durée d'un phénomène.
    /// </summary>
    class ClasseFille : ClassMere
    {
        public ClasseFille(ClassMere Acloner):base(Acloner)
        {    
        }

        public TimeSpan Duree { get; set; }

    }



Au final, ça revient un peu au même que ma méthode static, il faut bien copier chaque champ.....


Merci quand même de t'y être penché.

Bon dimanche.
Commenter la réponse de Whismeril
KX 15785 Messages postés samedi 31 mai 2008Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 23 nov. 2013 à 20:43
0
Merci
Il faut copier chaque champ, certes, mais uniquement par la classe qui se charge de ces attributs, tu n'as pas à faire la copie des champs de la classe mère dans la classe fille, qui fait que tu peux augmenter le nombre d'attributs dans la classe mère sans avoir à modifier toutes les classes filles. C'était bien le but ?
Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 24 nov. 2013 à 06:31
Ha oui, c'est exact. Je ne l'avais,pas vu sous cet angle.
Merci j'applique ça lundi.
Whismeril 12122 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 24 nov. 2013 à 06:58
J'ai déplacé ton commentaire en réponse pour pouvoir voter.
Commenter la réponse de KX

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.