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

Signaler
Messages postés
6
Date d'inscription
mardi 1 juillet 2008
Statut
Membre
Dernière intervention
11 septembre 2008
-
cs_Stephanie79
Messages postés
6
Date d'inscription
mardi 1 juillet 2008
Statut
Membre
Dernière intervention
11 septembre 2008
-
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 ?

3 réponses

Messages postés
6
Date d'inscription
mardi 1 juillet 2008
Statut
Membre
Dernière intervention
11 septembre 2008

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...
Messages postés
53
Date d'inscription
mercredi 29 août 2007
Statut
Membre
Dernière intervention
31 mars 2010

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  ?
Messages postés
327
Date d'inscription
mardi 17 février 2004
Statut
Membre
Dernière intervention
10 avril 2010
6
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.