IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[C#]Comment atteindre membre protected classe de base ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 8
    Par défaut [C#]Comment atteindre membre protected classe de base ?
    Bonjour,

    je tombe sur un problème de programmation objet qui me semble étrange :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        class foo { protected int i; }
     
        class bar : foo {
            public void g()
            {
                foo f = new foo();
                f.i   // INTERDIT
            }
        }
    ??? Bar est pourtant une classe dérivée de foo et je n'arrive pas à comprendre par quel miracle 'i' est invisible dans la fonction g(). Dois-je réviser mes cours de POO ?

    Merci

  2. #2
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Dois-je réviser mes cours de POO ?
    oui

    Dans ton cas de figure tu ne peux avoir accès au membre protégé que directement dans ta classe dérivée et non par une instance de la classe de base.
    Soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class foo
    { protected int i; } 
     
    class bar : foo
    { 
       public void g() 
       { base.i  = 0; //par exemple} 
    }
    Si tu tiens à tout prix à modifier i par une instance de foo, tu dois necessairement implémenter un accesseur qui expose i.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    class foo
    { 
       private int i;
       public int ivalue
       {
          get{ return this.i;}
          set
          { 
             //coder ici les verifs sur value puis si ok
             this.i = value;
           }
       }
    }
    class bar : foo
    { 
       public void g() 
       {
          foo f = new foo(); 
          f.iValue= -1 //par exemple  
       } 
    }

  3. #3
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 8
    Par défaut
    Merci neguib. Cela confirme ce que je pensais avoir deviné. J'ai cru que le fait que l'on se situe dans une classe dérivée autorisait l'accès à n'importe quel membre protégé d'une classe parente même s'il s'agissait d'une instance d'une classe de base

    Mais après réflexion c'est vrai que cela ne serait pas très logique, cela permettrait d'accéder aux propriétés protégées simplement en se plaçant dans une classe dérivée, ce qui causerait de gros soucis

    Merci de m'avoir fait voir la lumière !

  4. #4
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Si tu veux à tous prix que ce soit protected, tu peut aussi faire quelques bricoles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    class foo
    {
       private int i;
       protected int set_i(foo target,int val)
      {
         target.i = val;
      }
    }
    class bar : foo
    {
       public void g()
       {
          foo f = new foo();
          set_i(f,-1);
       }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 22/08/2010, 13h35
  2. Comment atteindre une <li class="ici">
    Par whitespirit dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 17/05/2010, 20h57
  3. Réponses: 4
    Dernier message: 06/04/2008, 18h34
  4. [VB.NET] Comment utiliser un membre Protected ?
    Par Aspic dans le forum VB.NET
    Réponses: 3
    Dernier message: 02/03/2006, 13h42
  5. Réponses: 3
    Dernier message: 12/01/2006, 21h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo