9

me escribió el siguiente código:C# para acceder miembro protegido en la clase derivada

public class A        
{ 
    protected string Howdy = "Howdy!";  
} 

public class B : A       
{ 
    public void CallHowdy() 
    { 
     A a = new A(); 
     Console.WriteLine(a.Howdy); 
    } 
} 

Ahora, en VS2010 que da como resultado el siguiente error de compilación:

Cannot access protected member 'A.a' via a qualifier of type 'A'; the qualifier must be of type 'B' (or derived from it).

Esto parece bastante ilógica para mí - ¿Por qué no puedo acceder al campo protected de la instancia de clase desde un método de la clase, que se deriva de él?

Entonces, ¿por qué sucede esto?


encontrado una respuesta estricta-http://blogs.msdn.com/b/ericlippert/archive/2005/11/09/491031.aspx

+1

+1 para una pregunta muy claramente escrita. :) – Almo

+0

Lo que puede hacer es crear un método estático protegido que proporcione acceso solo a una clase derivada, como por ejemplo: public class A { cadena protegida Howdy = "Howdy!"; } public class B: Un { CallHowdy public void() { A a = new A(); Console.WriteLine (a.Howdy); } } –

Respuesta

7

No está accediendo desde dentro de la clase, usted Estamos tratando de acceder a la variable como si fuera public. No es de esperar que esto compilar, y esto es más o menos lo que está tratando de hacer:

public class SomethingElse 
{ 
    public void CallHowdy() 
    { 
     A a = new A(); 
     Console.WriteLine(a.Howdy); 
    } 
} 

No hay relación, y suena como si estuviera confundido por qué ese campo no es pública.

Ahora, usted puede hacer esto, si se quería:

public class B : A 
{ 
    public void CallHowdy() 
    { 
     Console.Writeline(Howdy); 
    } 
} 

Debido B ha heredado los datos de A en este caso.

+0

Bueno, en realidad, estaba confundido por la posibilidad de hacer eso en 'PHP5' (también hice esta pregunta: http://stackoverflow.com/questions/10653991/php5-member-visibility). Diferencias como esta deberían tener una fuerte razón detrás de esto, ¿no crees? –

+0

Bueno, PHP parece ser el raro allí, ya que parece estar exponiendo una variable protegida ilegalmente. Parece que hay límites de tipo más estrictos que PHP en C#. – Tejs

+0

También estoy confundido por el hecho de que todos en la pregunta correspondiente 'PHP' me siguen diciendo cosas como *" ¿Por qué no debería ser accesible? Eso es perfectamente válido ". * Supongo que esta pregunta es más sobre ciertos hábitos de codificación. –

3

Usted podría hacer

public class B : A       
{ 
    public void CallHowdy() 
    { 
     Console.WriteLine(Howdy); 
    } 
} 

En su código, que está tratando de acceder desde fuera Howdy una A, no desde el interior de un B Aquí, se encuentra dentro de una B y, por lo tanto, puede acceder al miembro protegido en A.

0

Un miembro protegido es visible sólo para sí mismo y deriva miembros. En su caso, la declaración de A implica que solo se puede acceder a los miembros públicos, como si creara una instancia de A desde cualquier otra clase. Sin embargo, simplemente puede escribir esto. Bueno, porque, debido a la cadena de derivación, Howdy está disponible desde el interior de la clase B.

Cuestiones relacionadas