2010-10-29 8 views
5

Esto me confunde, por favor expanda el comportamiento de esto?C# ocultar confusión

Una declaración de un nuevo miembro oculta un miembro heredado solo dentro del alcance del nuevo miembro. Copia

**class Base 
{ 
    public static void F() {} 
} 
class Derived: Base 
{ 
    new private static void F() {} // Hides Base.F in Derived only 
} 
class MoreDerived: Derived 
{ 
    static void G() { F(); }   // Invokes Base.F 
}** 

En el ejemplo anterior, la declaración de F en F Derivado oculta la que fue heredado de la base, pero desde la nueva F en Derivado tiene acceso privado, su ámbito de aplicación no se extiende a MoreDerived. Por lo tanto, la llamada F() en MoreDerived.G es válida e invocará Base.F.

yo no soy la comprensión de que la forma en static void G() { F(); } puede acceder al método de la clase base de f cuando se puede tener acceso a todos los métodos de su inmediata superclase y super clase esconde el método F de la clase base

+0

No puede invocar 'Derived :: F()', porque ese método es privado. Fuera de 'Derived',' Derived :: F() 'tampoco puede existir. Es posible que deba cambiar un poco su ejemplo, a menos que eso haga que todo funcione, en cuyo caso, usted tiene su respuesta. – cHao

Respuesta

10

MoreDerived no pueden acceder a todo métodos de su súper clase; en particular, no puede acceder a los métodos private. En C#, cualquier cosa marcada private en una clase es invisible a cualquier cosa fuera de esa clase. En otras palabras, agregar o eliminar un método private no cambiará cómo se compila algo fuera de esa clase. Como el new private static void F es invisible para el mundo exterior, MoreDerived no se ve afectado.

Si el modificador era protected en su lugar, MoreDerivedsería verlo.

En el ejemplo que proporcionó, la palabra clave new solo cambia el significado de los nombres en el espacio de nombres. No cambia qué métodos están disponibles. Un método de Derived todavía puede llamar Base.F() así:

class Derived: Base 
{ 
    new private static void F() 
    { 
     F();  // calls Derived.F() 
     Base.F(); // calls Base.F() 
    } 
} 

class MoreDerived: Derived 
{ 
    static void G() 
    { 
     F();   // Invokes Base.F 
     Derived.F(); // Invokes Base.F because Derived.F is private 
     Base.F(); // Invokes Base.F 
    } 
} 

Es análogo a este ejemplo:

class Foo 
{ 
    int bar; // in most methods, this variable can be accessed as just "bar" 

    Foo(int bar) // this parameter will hide the instance member bar 
    { 
     this.bar = bar; // instance method can still be accessed, though 
    } 
} 
+0

Más rápido en el arma, supongo que no tengo que terminar mi párrafo. :) +1 – GalacticJello

+0

eso está bien pero cómo la clase másderrotada puede tener acceso al método de la clase base cuando no está disponible para su superclase inmediata que es solo mi confusión – NoviceToDotNet

+0

@NoviceToDotNet: Vea mis respuestas para su comentario anterior – TalentTuner

1

'nueva' palabra clave se oculta el elemento de base si se allowded a ser el acceso fuera de la clase .

Pero debido a la cadena de herencia MoreDerived: Derived: Base, verá los miembros públicos de la base de inmediaciones o las clases base superiores de la cadena.

La ocultación del método no es igual al modificador privado de un método.

+0

ver ocultar significa que el método de la clase base está oculto en la clase derivada bcas de NEW kwy word en la clase derivada. Ahora no es posible acceder al mundo exterior. Entonces, ¿cómo está esto disponible para una clase más Derivada? Esta es solo mi Pregunta – NoviceToDotNet

+0

Debido a la cadena de herencia MoreDerived: Derivado: Base, ahora si oculta el método F de base en derivado y lo hace privado, entonces en la clase más derviciada no hay nada público que puede ver en su elemento primario inmediato (Derivado) por lo tanto, escala la cadena y ve si alguna otra clase tiene F() y en tu caso sí, es Base, por lo que el compilador la pone a tu disposición. – TalentTuner

+0

pero tengo una confusión con esto que una clase derivada puede ver en su súper clase inmediata, ¿cómo puede la clase másDerived puede ir a la clase base por favor explícame señor – NoviceToDotNet