C # protegido membros acedida através da variável de classe base [duplicado]
-
11-09-2019 - |
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!
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.