Empêcher le cast d'une classe dérivée

Résolu
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 - 27 avril 2009 à 19:36
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 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 ! -

12 réponses

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
28 avril 2009 à 11:33
Le mot-clé new CASSE la logique objet et n'est PAS le comportement normal et attendu.
Ca n'aurait aucun sens...

<hr />
-Blog-
-Site Perso-
3
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
28 avril 2009 à 11:46
Oui.

<hr />
-Blog-
-Site Perso-
3
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
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!

<hr />
-Blog-
-Site Perso-
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
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.)

<hr />
-Blog-
-Site Perso-
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
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.
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
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 ! -
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
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.
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
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 ! -
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
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)

<hr />
-Blog-
-Site Perso-
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
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.
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
28 avril 2009 à 11:24
Oula, j'ai un gros doute...

Pourtant, j'ai fait le test

private int MaMethode(Mere m)
        {
            return m.Machin();
        }
}

public class Mere
{
    public int Machin()
    {
        return 0;
    }
}

public class Fille : Mere
{
    new public int Machin()
    {
        return 1;
    }
}

en faisant l'appel à MaMethode(new Fille()), elle renvoie 0...

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
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 ! -
0
Rejoignez-nous