2010-10-29 14 views
5

To jest mylące dla mnie proszę expalin mnie zachowanie tego?C# ukrywanie zamieszania

Oświadczenie nowego członka ukrywa dziedziczonego członka wyłącznie w zakresie nowego członka. Kopiowanie

**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 
}** 

W powyższym przykładzie, deklaracja F w Pochodzące ukrywa F, który został odziedziczony z bazy, ale ponieważ nowa F w Pochodzące posiada dostęp do prywatnej, jej zakres nie obejmuje MoreDerived. Zatem wywołanie F() w MoreDerived.G jest poprawne i wywoła Base.F.

ja nie rozumiejąc, że jak static void G() { F(); } może uzyskać dostęp do metody klasy bazowej f kiedy może uzyskać dostęp do wszystkich metod jest natychmiastowa klasy super i super klasa ukrywa metodę F klasy bazowej

+0

Nie można wywołać 'Wyprowadzonego :: F()', ponieważ ta metoda jest prywatna. Poza 'Derived',' Derived :: F() 'może równie dobrze nie istnieć. Być może będziesz musiał trochę zmienić swój przykład, chyba że to wszystko działa - w takim przypadku masz odpowiedź. – cHao

Odpowiedz

10

MoreDerived nie może uzyskać dostępu wszystkie metody jego super klasy; w szczególności nie może uzyskać dostępu do metod private. W języku C# wszystko oznaczone na klasie jako private jest niewidoczne dla niczego poza tą klasą. Innymi słowy, dodanie lub usunięcie metody private nie zmieni tego, jak kompiluje się coś poza tą klasą. Ponieważ kamera new private static void F jest niewidoczna dla świata zewnętrznego, nie ma na nią wpływu MoreDerived.

Jeśli zamiast tego modyfikator to protected, będzie to .

W podanym przykładzie słowo new zmienia jedynie znaczenie nazw w przestrzeni nazw. Nie zmienia to, jakie metody są dostępne. Sposób Derived można jeszcze nazwać Base.F() tak:

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 
    } 
} 

Jest to analogiczne do tego przykładu:

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

Szybciej na pistolecie, zgaduję, że nie muszę kończyć mojego akapitu. :) +1 – GalacticJello

+0

To dobrze, ale jak klasa morederived może mieć dostęp do metody klasy bazowej, gdy nie jest dostępna dla jej bezpośredniej super klasy, to jest tylko moje zamieszanie – NoviceToDotNet

+0

@NoviceToDotNet: Zobacz moje odpowiedzi na powyższy komentarz – TalentTuner

1

„nowe” słowo kluczowe ukryje element bazowy, jeśli jest allowded aby mieć dostęp poza klasą .

Ale ze względu na łańcuch dziedziczenia MoreDerived: Derived: Base, zobaczysz publicznych członków bazy immeditae lub wyższej klasy bazowej w łańcuchu.

Ukrywanie metod nie jest równe prywatnemu modyfikatorowi metody.

+0

zobacz chowanie oznacza, że ​​metoda klasy bazowej jest ukryta w bcas klasy pochodnej NOWEGO słowa kwy w klasie pochodnej. Teraz nie jest dostępny dla zewnętrznego świata. Więc jak to jest dostępne dla klasy MoreDerived, to tylko moje pytanie – NoviceToDotNet

+0

Z powodu łańcucha dziedziczenia MoreDerived: Derived: Base, więc teraz, jeśli ukryjesz bazową metodę F w wyprowadzeniu i uczynisz ją prywatną, więc w klasie bardziej pochodnej nie ma nic publicznego może zobaczyć w swoim bezpośrednim rodzicu (Derived), a więc drabinkuje w górę łańcucha i sprawdza, czy jakakolwiek inna klasa ma F(), aw twoim przypadku tak, to jest baza, więc kompilator udostępnia ją dla ciebie. – TalentTuner

+0

ale ai am zysk mylić z tym, że klasa pochodna może zobaczyć w jego bezpośrednim super klasy, więc w jaki sposób klasa moreDerived może przejść do klasy podstawowej proszę wyjaśnić mi sir – NoviceToDotNet