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

Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
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 

Votre réponse

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
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-

Merci cs_Bidou 3

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

Codes Sources a aidé 101 internautes 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
3
Merci
Oui.

<hr />
-Blog-
-Site Perso-

Merci cs_Bidou 3

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

Codes Sources a aidé 101 internautes 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
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
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
4947
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
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
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
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
4947
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
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
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
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
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
4947
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
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
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
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
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
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

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.