2013-04-04 20 views
6

mam dwie klasyużywać nowych słów kluczowych w języku C#

class A 
{ 
    public virtual void Metod1() 
    { 
     Console.WriteLine("A.Method1"); 
    } 
} 

class B : A 
{ 
    public new void Metod1() 
    { 
     Console.WriteLine("B.Method1"); 
    } 
} 

Potem napisać kod, który deklaruje instancje tych klas i wzywa ich metody

 static void Main(string[] args) 
    { 
     A a = new B(); 
     a.Metod1(); 
     B b = new B(); 
     b.Metod1(); 
     Console.ReadKey(); 
    } 

dałem następujący wynik:

A.Method1 
B.Method1 

Ale kiedy usunę słowo kluczowe nowe z metody signature1 klasy B i uruchomię metodę Main, otrzymałem ten sam wynik. Pytanie: Czy nowe słowo kluczowe jest podpisem metod tylko dla lepszej czytelności?

Edytuj: Czy są przypadki, w których nie możemy obejść się bez nowego słowa kluczowego?

+0

trzeba użyć nadpisanie lub nowy w klasie B bacause inaczej ukrywa metodę elementu nadrzędnego za .. domyślnym jest nowy więc jeśli nie umieści nowy to nie daje błąd i przebiegają bez zarzutu. –

+0

Nota bierna: Rozważ "pomieszaj czytelników i użytkowników kodu", aby być głównym użyciem "nowego" w takim kontekście. Zdarzają się przypadki, w których korzystanie z niego może poprawić czytelność (tj. Konieczność wyprowadzenia klasy dla nieprzyjaznej klasy bazowej), ale w większości przypadków trudniej jest zrozumieć, kiedy zostanie wywołana metoda klasy bazowej i kiedy zostanie uzyskana. –

Odpowiedz

3

Tak, masz rację, to jest dla lepszej czytelności w tej sytuacji.

Ale sprawdź dokładnie, powinieneś mieć ostrzeżenie, aby nie używać nowego podczas ukrywania metody bazowej.

można przeczytać więcej tutaj: http://msdn.microsoft.com/en-us/library/vstudio/435f1dw2.aspx

+0

Napisałeś, że jest to dla lepszej czytelności w tej sytuacji. Ale czy są sytuacje, w których nie możemy się obejść bez nowego słowa kluczowego – cosset

+0

@cosset Tak, gdy nie jest używany jako modyfikator, np .: Class1 C = new Class1() lub kiedy ustawisz traktować ostrzeżenia jako błędy. –

+0

Czy są sytuacje, w których nie możemy się obejść bez nowego słowa kluczowego pod względem metod, pola – cosset

6

Knowing When to Use Override and New Keywords (C# Programming Guide)

C#, sposób, w klasie pochodnej mogą mieć taką samą nazwę jako metoda w klasie bazowej. Możesz określić sposób interakcji między metodami, stosując nowe i zastępujące słowa kluczowe. Modyfikator override rozszerza bazową metodę klasy , , a nowy modyfikator ukrywa ją.

również

Dzięki zastosowaniu nowego, jesteś twierdząc, że są świadomi, że człon że modyfikuje ukrywa element, który jest dziedziczona od podstawy klasy.

+0

czy klasa podstawowa nadal potrzebuje 'wirtualnego' w metodzie dla' nowego' w pochodnej, aby mieć jakiś wpływ? W moich testach posiadanie "nowego" na klasie pochodnej ma takie samo zachowanie, jak po prostu brak "przesłonięcia" - czego mi brakuje? Co to znaczy "ukrywa to"? – mmcrae

7

nowy kluczowe niech czytelnik kod zdawać sobie sprawę, że ta metoda będzie ukryć metodę o tej samej nazwie w jego podstawy. Nawet jeśli pominąłbyś to, kompilator potraktowałby to w taki sam sposób, ale ostrzegł cię o tym.

Ponieważ oświadczył Sposób wirtualnym, co można uzyskać to ostrzeżenie podczas kompilacji:

'B.Metod1() ukrywa odziedziczoną członkowskiego 'A.Metod1()'. Aby bieżący członek zastąpił tę implementację, dodaj słowo kluczowe override. W przeciwnym razie dodaj nowe słowo kluczowe.

Jeśli jednak zmienić deklarację poprzez usunięcie wirtualny jak:

  • deklaracja bez wirtualny w A

    class A { 
        public void Metod1() { 
         Console.WriteLine("A.Method1"); 
        } 
    } 
    
    class B: A { 
        public void Metod1() { 
         Console.WriteLine("B.Method1"); 
        } 
    } 
    

nadal skompilować, ale komunikat ostrzegawczy będzie:

'B.Metod1()' ukrywa dziedziczony element 'A.Metod1()'.Użyj nowego słowa kluczowego, jeśli ukrywanie było ukryte pod kątem .

W albo sposób jak wyżej, co następuje:

  • kod testowy

    var b=new B(); 
    b.Metod1(); 
    (b as A).Metod1(); 
    

wyjście wola:

 
B.Method1 
A.Method1 

Ale jeśli zadeklarować jako followin g:

  • Deklaracja z przesłanianie w B

    class A { 
        public virtual void Metod1() { 
         Console.WriteLine("A.Method1"); 
        } 
    } 
    
    class B: A { 
        public override void Metod1() { 
         Console.WriteLine("B.Method1"); 
        } 
    } 
    

Następnie wyjście byłoby:

 
B.Method1 
B.Method1 

To dlatego Method1 klasy bazowej nie tylko ukryte, ale zastąpiono przez klasę pochodną.

Przypadek że nie wystarczy użyć nowy jest to, że jeśli Method1 jest streszczenie metoda w abstrakcyjnej klasy:

  • kod, który musi użyć nadpisanie w klasach pochodnych

    abstract class A { 
        public abstract void Metod1(); 
    } 
    
    class B: A { 
        public override void Metod1() { // use `new` instead of `override` would not compile 
         Console.WriteLine("B.Method1"); 
        } 
    } 
    

W tym przypadku nie można po prostu użyć nowego, ponieważ A wymaga klas pochodnych do przesłonięcia Method1.

+0

Jest ok, ale pytanie: czy nowe słowo kluczowe sygnuje metody tylko dla lepszej czytelności i czy są przypadki, w których nie możemy obejść się bez nowego słowa kluczowego – cosset

+0

, więc tak naprawdę nie zmienia żadnego zachowania - to tylko dla dobra czytelnictwa? – mmcrae

Powiązane problemy