Pregunta

    

Esta pregunta ya tiene una respuesta aquí:

         

Puede parecer pregunta bastante novato, pero ¿puede explicar por qué método Der.B () No se puede acceder a través protegida Foo variable de clase Base? Esto parece extraño para mí:

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
}

Gracias!

¿Fue útil?

Solución

Esta es una pregunta frecuente. Para entender por qué esto es ilegal, pensar en lo que podía salir mal.

Supongamos que hubiera otra clase derivada FROB derivadas de la base. Ahora se pasa una instancia del FROB a Der.B. En caso de ser capaz de acceder Frob.Foo de Der.B? No absolutamente no. Frob.Foo está protegido; sólo debería ser accesible desde FROB y subclases de FROB. Der no se FROB y no es una subclase de FROB, por lo que no consigue el acceso a los miembros protegidos del FROB.

Si eso no es clara, véase mi artículo sobre el tema:

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

Otros consejos

En B que está intentando acceder a un miembro de otra clase protegida. El hecho de que usted está heredando de esa clase es irrelevante. En D tiene acceso a un miembro protegido de la clase base de la clase actual. En este contexto se puede acceder a cualquier cosa de Der y los miembros protected de la clase que hereda de.

Puede evitar esta limitación, al declarar un método estático en la clase 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 pocas palabras, protegido permite el acceso a las subclases.

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

Está intentando acceder a un miembro protegido su instancia de Der no tiene acceso a. Que sólo tienen acceso a ella si era la clase base de la instancia actual de Der (este).

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

funciona bien, ya que van a través Der acceder a su base método protegido clases.

En el escenario que estamos tratando que querrá utilizar "interno" de Foo int.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top