Problème pour accéder à une méthode de base à partir d'une classe dérivée [Résolu]

Messages postés
6
Date d'inscription
mardi 1 juillet 2008
Statut
Membre
Dernière intervention
11 septembre 2008
- - Dernière réponse : cs_Stephanie79
Messages postés
6
Date d'inscription
mardi 1 juillet 2008
Statut
Membre
Dernière intervention
11 septembre 2008
- 13 août 2008 à 15:23
Bonjour,

Je suis débutante en POO et surtout en C#, donc j'espère que je vais bien m'expliquer.
Voici un bout de code (je n'ai pas mis les vrais noms de classes, ni tous les attributs pour des raisons de confidentialité, car c'est une appli professionnelle) :

abstract class Unite
{
       protected Group pParent; //Parent de l'objet courant, si null, l'objet courant est la racine

        //propriété de pParent
         public Group Parent
        {
            get { return pParent; }
            protected set
            {
                pParent=value;
            }
        }      
}

class Group : Unite
{
       private List pUnites;

        public void AjouterUnite(Unite unit)
        {
            pUnites.Add(unit);
            unit.Parent=this;
        }
}

Je ne sais pas si vous avez bien compris le principe, mais ce qu'on réalise, c'est un arbre. Et l'attribut pParent de la classe de base me permet de remonter l'arbre jusqu'à la racine.
Le problème c'est que cette syntaxe "unit.Parent=this" ne fonctionne pas. J'ai l'erreur : "Impossible d'accéder au membre protégé 'Unite.Parent' par l'intermédiaire d'un qualificateur de type 'Unite' ; le qualificateur doit être de type 'Group' (ou dérivé de celui-ci)". Je ne comprends pas du tout pourquoi vu que unit est un objet de la classe de base et que la méthode protégée est appelée à partir de la classe dérivée.

Quelqu'un a-t-il une solution ?
Afficher la suite 

3 réponses

Meilleure réponse
Messages postés
6
Date d'inscription
mardi 1 juillet 2008
Statut
Membre
Dernière intervention
11 septembre 2008
3
Merci
Merci pour vos réponses à tous les deux.

Cipoli, ce que tu me dis ne vas pas fonctionner : je n'ai certainement pas donné assez d'explications.
La méthode AjouterUnite permet d'ajouter une unité à un groupe d'unités. Et à l'intérieur de cette méthode, je veux définir le parent de l'unité que j'ajoute au groupe. Et le parent de cet unité c'est ce groupe lui-même.
Donc si tu fais unit.Parent=this.Parent, tu lui dis que tu veux que son parent soit le parent du groupe. Par exemple, si mes classes voulaient représenter un arbre de famille, dans ta solution, tu dirais que l'enfant du père a pour père, le père du père donc le grand-père (ouf je sais pas si c'est très clair lol).

WishhhMaster, j'ai bien regardé le lien et en effet ça correspond à mon problème. Si j'ai bien compris ce qui est expliqué, ça ne fonctionne pas car c'est une autre instance de Unite et pas son instance courante. Mais je ne peux pas mettre le set en public, et à cause de la structure de mes classes je ne peux pas non plus faire AjouterGroup(Group unit).
J'ai essayé cette solution qui est un lien dans celui que tu m'as envoyé. : http://blogs.msdn.com/ericlippert/archive/2008/03/28/why-can-t-i-access-a-protected-member-from-a-derived-class-part-two-why-can-i.aspx

Ca consiste à englober la classe Group dans la classe Unite. Ca fonctionne mais ça me parait un peu bizarre. Après je ne suis qu'une novice donc je ne peux pas juger...

Dire « Merci » 3

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

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

Commenter la réponse de cs_Stephanie79
Messages postés
53
Date d'inscription
mercredi 29 août 2007
Statut
Membre
Dernière intervention
31 mars 2010
0
Merci
Salut ,
Je suis pas sur d'avoir compris ton probleme.

Mais c'est pas plutot
unit.Parent=this.Parent             au lieu de                   unit.Parent=this  ?
Commenter la réponse de Cipoli
Messages postés
327
Date d'inscription
mardi 17 février 2004
Statut
Membre
Dernière intervention
10 avril 2010
5
0
Merci
Salut,

Comme solution soit tu mets ton set en public,  soit tu change public void AjouterUnite(Unite unit) and public void AjouterGroup(Group unit) (mais donc tu ne peux ajouter que des instances de Group...)

Regarde là si ça peut t'aider:
http://blogs.developpeur.org/matthieu/archive/2008/03/29/c-3-la-correction-d-un-bug-sur-le-compilateur-qui-peut-emp-cher-votre-code-crit-en-c-2-de-compiler.aspx
Personnelement, j'ai le même même problème en .Net 2 ou 3.
Commenter la réponse de WishhhMaster