Empêcher le cast d'une classe dérivée [Résolu]

krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 27 avril 2009 à 19:36 - Dernière réponse : cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscriptionModérateurStatut 20 juin 2013 Dernière intervention
- 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 ! -
Afficher la suite 

12 réponses

Répondre au sujet
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscriptionModérateurStatut 20 juin 2013 Dernière intervention - 28 avril 2009 à 11:33
+3
Utile
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-
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Bidou
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscriptionModérateurStatut 20 juin 2013 Dernière intervention - 28 avril 2009 à 11:46
+3
Utile
Oui.

<hr />
-Blog-
-Site Perso-
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Bidou
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscriptionModérateurStatut 20 juin 2013 Dernière intervention - 27 avril 2009 à 23:10
0
Utile
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-
Commenter la réponse de cs_Bidou
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscriptionModérateurStatut 20 juin 2013 Dernière intervention - 27 avril 2009 à 23:12
0
Utile
(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-
Commenter la réponse de cs_Bidou
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscriptionModérateurStatut 14 février 2014 Dernière intervention - 28 avril 2009 à 08:52
0
Utile
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.
Commenter la réponse de sebmafate
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 28 avril 2009 à 10:16
0
Utile
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 ! -
Commenter la réponse de krimog
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscriptionModérateurStatut 14 février 2014 Dernière intervention - 28 avril 2009 à 10:25
0
Utile
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.
Commenter la réponse de sebmafate
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 28 avril 2009 à 10:50
0
Utile
@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 ! -
Commenter la réponse de krimog
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscriptionModérateurStatut 20 juin 2013 Dernière intervention - 28 avril 2009 à 10:57
0
Utile
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-
Commenter la réponse de cs_Bidou
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscriptionModérateurStatut 14 février 2014 Dernière intervention - 28 avril 2009 à 10:59
0
Utile
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.
Commenter la réponse de sebmafate
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 28 avril 2009 à 11:24
0
Utile
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 ! -
Commenter la réponse de krimog
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 28 avril 2009 à 11:42
0
Utile
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 ! -
Commenter la réponse de krimog

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.