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

Messages postés
12391
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 décembre 2018
-
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

4 réponses

Meilleure réponse
Messages postés
14322
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
14 décembre 2018
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).

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

KX
Messages postés
15866
Date d'inscription
samedi 31 mai 2008
Statut
Contributeur
Dernière intervention
14 décembre 2018
-
"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
Messages postés
14322
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
14 décembre 2018
-
"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
Messages postés
12391
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 décembre 2018
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
Messages postés
15866
Date d'inscription
samedi 31 mai 2008
Statut
Contributeur
Dernière intervention
14 décembre 2018
-
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
Messages postés
12391
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 décembre 2018
-
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
Messages postés
15866
Date d'inscription
samedi 31 mai 2008
Statut
Contributeur
Dernière intervention
14 décembre 2018
-
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
Messages postés
12391
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 décembre 2018
-
Et ben, je regarde ça lundi.
Merci
Commenter la réponse de Whismeril
Messages postés
12391
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 décembre 2018
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
Messages postés
15866
Date d'inscription
samedi 31 mai 2008
Statut
Contributeur
Dernière intervention
14 décembre 2018
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
Messages postés
12391
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 décembre 2018
-
Ha oui, c'est exact. Je ne l'avais,pas vu sous cet angle.
Merci j'applique ça lundi.
Whismeril
Messages postés
12391
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 décembre 2018
-
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.