Domanda

    

Questa domanda ha già una risposta qui:

         

Si può sembra piuttosto domanda newbie, ma si può spiegare il motivo per cui il metodo Der.B () non può accedere protetto Foo tramite variabile di classe di base? Questo sembra strano per me:

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
}

Grazie!

È stato utile?

Soluzione

Questa è una domanda frequente. Per capire il motivo per cui questo è illegale, pensare a cosa potrebbe andare male.

Supponiamo che aveva un altro Frob classe derivata derivata dalla base. Ora si passa un'istanza di Frob a Der.B. Si dovrebbe essere in grado di accedere Frob.Foo da Der.B? No, assolutamente no. Frob.Foo è tutelato; dovrebbe essere accessibile da Frob e sottoclassi di Frob solo. Der non è frob e non è una sottoclasse di Frob, in modo da non ottenere l'accesso a membri protetti di gingillo.

Se questo non è chiaro, vedi il mio articolo sul tema:

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

Altri suggerimenti

In B si sta tentando di accedere a un membro protetto di un'altra classe. Il fatto che si eredita da quella classe è irrilevante. In D si accede a un membro protetto della classe base della classe corrente. In questo contesto è possibile accedere a qualsiasi cosa, da Der ei membri del tipo che eredita dalla protette.

È possibile aggirare questa limitazione dichiarando un metodo statico nella classe 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
}

In poche parole, protetto consente l'accesso alle classi secondarie.

A:

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

Si sta tentando di accedere a un membro protetto l'istanza di Der non ha accesso a. Dovrebbe solo l'accesso ad essa se fosse la classe base del tuo attuale istanza di Der (questo).

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

funziona bene perché si sta andando attraverso Der per accedere è classi di base metodo protetto.

Nello scenario che si sta cercando si vorrà utilizzare "interna" per int Foo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top