Whismeril
Messages postés19026Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention20 avril 2024
-
Modifié par Whismeril le 21/11/2013 à 21:43
Whismeril
Messages postés19026Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention20 avril 2024
-
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.
NHenry
Messages postés15113Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention22 avril 2024159 21 nov. 2013 à 22:16
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).
KX
Messages postés16733Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention31 janvier 2024127 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
Messages postés15113Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention22 avril 2024159 22 nov. 2013 à 13:44
"Sans trop connaitre Java"
D'autant que ça n'en est pas ;-)
Whismeril
Messages postés19026Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention20 avril 2024656 22 nov. 2013 à 18:51
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és16733Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention31 janvier 2024127 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
Messages postés19026Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention20 avril 2024656 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
Messages postés16733Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention31 janvier 2024127 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
Messages postés19026Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention20 avril 2024656 22 nov. 2013 à 20:39
Whismeril
Messages postés19026Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention20 avril 2024656 23 nov. 2013 à 20:11
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.....
KX
Messages postés16733Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention31 janvier 2024127 23 nov. 2013 à 20:43
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és19026Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention20 avril 2024656 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
Messages postés19026Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention20 avril 2024656 24 nov. 2013 à 06:58
J'ai déplacé ton commentaire en réponse pour pouvoir voter.
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 ? :)