krimog
Messages postés1860Date d'inscriptionlundi 28 novembre 2005StatutMembreDernière intervention14 février 2015
-
27 avril 2009 à 19:36
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 2013
-
28 avril 2009 à 11:46
Bonsoir (ou bonjour) à tous
Sur ce sujet, je suis resté avec une question que je pourrais simplifier en ceci :
J'ai ma classe Fille qui dérive de ma classe Mere
Cependant, je souhaiterais empêcher de caster une Fille en Mere.
Exemple plus précis :
private void MaMethode(Mere m);
MaMethode(new Mere()); // doit marcher
MaMethode(new Fille()); // Ne doit pas marcher
Y a-t-il un moyen d'éviter ça (un mot clé ou quelque chose dans le genre) ?
(Je parle autrement qu'en vérifiant le type de m dans MaMethode())
Merci d'avance
PS : Ce n'est pas un problème que j'ai rencontré ou un projet sur lequel je travaille, il s'agit juste d'une petite question de culture "générale" que je me pose.
Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 27 avril 2009 à 23:10
Salut,
Je ne pense pas, je dirais même que je n'espère pas car à priori c'est un non-sens.
Un objet fille doit toujours pouvoir être casté dans un objet mère, c'est bien le but de la programmation orientée objet, non?
Si on arrive un jour sur un tel problème, c'est probablement qu'on a réalisé une erreur de conception quelque part!
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 27 avril 2009 à 23:12
(Par contre, l'inverse est faisable:
C'est à dire qu'on peut potentiellement casté n'importe quel type vers n'importe quel autre type en effectuant les implémentation correctes de implicit et explicit operator.)
sebmafate
Messages postés4936Date d'inscriptionlundi 17 février 2003StatutMembreDernière intervention14 février 201437 28 avril 2009 à 08:52
même remarque que Bidou... si tu ne veux pas d'une calsse fille à la place d'une classe mère, c'est que ta classe fille ne doit pas hériter de la classe mère.
krimog
Messages postés1860Date d'inscriptionlundi 28 novembre 2005StatutMembreDernière intervention14 février 201549 28 avril 2009 à 10:16
Je comprends tout à fait la remarque, je suis même parfaitement d'accord avec.
Mon problème ne vient pas d'une erreur de conception, tout d'abord parce que c'était juste une question "en l'air" comme je l'ai précisé. Je conçois tout à fait qu'il est logique qu'un objet d'une classe fille en soit avant tout un d'une classe mère.
Cependant, on peut réfléchir au fait, par exemple, qu'on souhaite que l'objet que la méthode reçoit ait le comportement par défaut d'une méthode, alors que des sous-classes pourraient l'avoir surchargée. Comment faire alors ?
Je me demandais juste s'il n'existait pas un moyen d'empêcher tout cast, implicite ou explicite, du genre un mot clé qui génèrerait ce genre de code :
if (var.GetType() != typeof(MonType)) throw new Exception("Blabla");
Apparemment, ce n'est pas le cas. Tant pis ;)
Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
sebmafate
Messages postés4936Date d'inscriptionlundi 17 février 2003StatutMembreDernière intervention14 février 201437 28 avril 2009 à 10:25
Ce que tu as du mal à comprendre, c'est que pas définition (règle première de la POO) toute classe fille hérite des propriétés (et du comportement) de sa classe mère.
krimog
Messages postés1860Date d'inscriptionlundi 28 novembre 2005StatutMembreDernière intervention14 février 201549 28 avril 2009 à 10:50
@Sebmafate : Non, j'ai parfaitement compris ça. La POO, je maîtrise relativement bien. (D'ailleurs, j'ai rappelé "il est logique qu'un objet d'une classe fille en soit avant tout un d'une classe mère.")
Cependant, je viens de me rendre compte que je suis très fatigué... J'avais dans l'idée que si tu fournissais une classe fille lorsqu'on demande une classe mère, les méthodes utilisées sont celles de la classe fille si elles sont surchargées (ce qui est faux, évidemment).
Au temps pour moi, ça m'apprendra à ne pas assez dormir la nuit ;)
Merci pour vos réponses en tout cas.
Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 28 avril 2009 à 10:57
Non c'est les méthodes de la classe fille qui sont appelées!!!!
(du moins si on programme correctement; de toute façon le compilateur met un warning si on n'utilise pas new/virtual/override)
sebmafate
Messages postés4936Date d'inscriptionlundi 17 février 2003StatutMembreDernière intervention14 février 201437 28 avril 2009 à 10:59
hum... j'ai du mal à comprendre le sens de ta phrase : "J'avais dans l'idée que si tu fournissais une classe fille lorsqu'on demande une classe mère, les méthodes utilisées sont celles de la classe fille si elles sont surchargées (ce qui est faux, évidemment)."
si tu fournis une classe fille... c'est bien les méthodes définies dans la classe fille qui sont appelées.
krimog
Messages postés1860Date d'inscriptionlundi 28 novembre 2005StatutMembreDernière intervention14 février 201549 28 avril 2009 à 11:42
Ah oui, pardon.
Ça renvoie 1 avec virtual/override.
Mais donc, si je résume, si une méthode n'est pas déclarée en virtual, on peut être absolument sûr que ce sera cette méthode qui sera appelée, même s'il s'agit de l'objet fille. Je ne me trompe pas ?
Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -