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

Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
- - Dernière réponse : cs_Bidou
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
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 ! -
Afficher la suite 

12 réponses

Meilleure réponse
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
42
3
Merci
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-

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 207 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Bidou
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
42
3
Merci
Oui.

<hr />
-Blog-
-Site Perso-

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 207 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Bidou
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
42
0
Merci
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
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
42
0
Merci
(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
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
0
Merci
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
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
30
0
Merci
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
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
0
Merci
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
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
30
0
Merci
@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
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
42
0
Merci
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
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
0
Merci
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
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
30
0
Merci
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
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
30
0
Merci
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