Question

    

Cette question a déjà une réponse ici:

         

Il peut semble plutôt question débutant, mais pouvez-vous expliquer pourquoi la méthode Der.B () ne peut pas accès protégé par Foo variable de classe de base? Cela semble bizarre pour moi:

public class Base
{
    protected int Foo;
}

public class Der : Base
{
    private void B(Base b) { Foo = b.Foo; } // Error: Cannot access protected member

    private void D(Der d) { Foo = d.Foo; } // OK
}

Merci!

Était-ce utile?

La solution

Ceci est une question fréquemment posée. Pour comprendre pourquoi cela est illégal, pensez à ce qui pourrait mal tourner.

Supposons que vous aviez une autre Frob de classe dérivée dérivée de la base. Maintenant, vous passez une instance de Frob à Der.B. Si vous êtes en mesure d'accéder Frob.Foo de Der.B? Non, absolument pas. Frob.Foo est protégé; il ne devrait être accessible à partir Frob et sous-classes de Frob. Der ne FROB et n'est pas une sous-classe de Frob, de sorte qu'il ne soit pas l'accès aux membres protégés de FROB.

Si ce n'est pas clair, voir mon article sur le sujet:

http://blogs.msdn.com/ericlippert/ archives / 2005/11/09 / 491031.aspx

Autres conseils

B vous essayez d'accéder à un membre protégé d'une autre classe. Le fait que vous héritez de cette classe est hors de propos. Dans D vous accédez à un membre protégé de la classe de base de votre classe actuelle. Dans ce contexte, vous pouvez accéder à quoi que ce soit de Der et les membres protégés du type il est héritant de.

Vous pouvez contourner cette limitation en déclarant une méthode statique dans la classe de base:

public class Base
{
    protected int Foo;

    protected static int GetFoo(Base b)
    {
        return b.Foo;
    }
}

public class Der : Base
{
    private void B(Base b) { Foo = GetFoo(b); } // OK
}

En termes simples, protégé permet d'accéder aux sous-classes.

:

private void B(Base b) { Foo = b.Foo; }

Vous essayez d'accéder à un membre protégé votre instance de Der n'a pas accès. Il n'aurait accès à elle si elle était la classe de base de votre instance actuelle de Der (ce).

private void D(Der d) { Foo = d.Foo; } // OK

fonctionne très bien parce que vous traversez Der pour accéder ses classes de base méthode protégée.

Dans le scénario que vous essayez, vous aurez envie d'utiliser « interne » pour int Foo.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top