/// <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.
A voir également:
Classe fille c++
String fille de ma classe - Meilleures réponses
Constructeur classe fille c++ - Meilleures réponses
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
"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...
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.
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...
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.
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);
}
}
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.....
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 ?
22 nov. 2013 à 07:51
D'autant que ça n'en est pas ;-)
En C# on devrait faire :
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...
22 nov. 2013 à 13:44
D'autant que ça n'en est pas ;-)
On en peut même plus ne pas être réveiller ? :)