Pergunta

Esta questão já tem uma resposta aqui:

Pode parecer pergunta bastante novato, mas você pode explicar por que método Der.B () não pode acesso protegido Foo via variável de classe Base? Isso parece estranho para mim:

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
}

Obrigado!

Foi útil?

Solução

Esta é uma pergunta freqüente. Para descobrir por que isso é ilegal, pensar sobre o que poderia dar errado.

Suponha que você teve outra classe derivada Frob derivado de Base. Agora você passar uma instância de Frob para Der.B. Se você acessar a Frob.Foo de Der.B? Não, absolutamente não. Frob.Foo está protegido; ele só deve ser acessível a partir Frob e subclasses de Frob. Der não é Frob e não é uma subclasse de Frob, para que ele não tenha acesso aos membros protegidos do FROB.

Se isso não é claro, ver meu artigo sobre o assunto:

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

Outras dicas

Na B você está tentando acessar um membro protegido de outra classe. O fato de que você está herdando de que a classe é irrelevante. Em D você está acessando um membro protegidos da classe base de sua classe atual. Neste contexto, você pode acessar qualquer coisa de Der e os membros protegidos do tipo que está herdando.

Você pode contornar essa limitação, declarando um método estático na 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
}

Em termos simples, protegido permite o acesso a sub classes.

In:

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

Você está tentando acessar um membro protegido sua instância do Der não tem acesso. Ele só teria acesso a ele se era a classe base da instância atual de Der (this).

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

funciona bem, porque você está passando Der acesso é método protegido classes de base.

No cenário que você está tentando você vai querer usar "interno" para int Foo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top