2010-09-06 11 views

Odpowiedz

47

Ukrywa właściwość navUrl klasy podstawowej. Zobacz new Modifier. Jak wspomniano we wpisie MSDN, można uzyskać dostęp do "ukrytej" właściwości o pełnych nazwach: BaseClass.navUrl. Nadużycie jednego z nich może doprowadzić do ogromnego zamieszania i możliwego obłędu (to jest złamanego kodu).

+8

Opcja 'new' modyfikator nie powoduje to zachowanie, informuje kompilator, że zrobił to celowo, więc nie wyświetli ostrzeżenia. – BornToCode

8

new ukrywa nieruchomość.

Może tak być w kodzie:

class base1 
{ 
    public virtual string navUrl 
    { 
     get; 
     set; 
    } 
} 

class derived : base1 
{ 
    public new string navUrl 
    { 
     get; 
     set; 
    } 
} 

Tutaj w klasie pochodnej, właściwość navUrl ukrywa właściwość klasy bazowej.

3

Kilka razy dalej Shadowing lub method hiding; Wywoływana metoda zależy od typu odwołania w punkcie, w którym wykonywane jest połączenie. This might pomoc.

3

Jest to również udokumentowane here.

Fragment kodu z msdn.

public class BaseClass 
{ 
    public void DoWork() { } 
    public int WorkField; 
    public int WorkProperty 
    { 
     get { return 0; } 
    } 
} 

public class DerivedClass : BaseClass 
{ 
    public new void DoWork() { } 
    public new int WorkField; 
    public new int WorkProperty 
    { 
     get { return 0; } 
    } 
}  

DerivedClass B = new DerivedClass(); 
B.WorkProperty; // Calls the new property. 

BaseClass A = (BaseClass)B; 
A.WorkProperty; // Calls the old property. 
+2

Twój fragment kodu dobrze wyjaśnia pojęcie ukrywania, jednak modyfikator 'new' nie powoduje takiego zachowania, informuje jedynie kompilator, że zrobił to celowo, więc nie wyświetli ostrzeżenia. – BornToCode

+0

Co powoduje to zachowanie? Zwykle A.WorkProperty wywoływałoby właściwość klasy pochodnej, ponieważ A odwołuje się do obiektu pochodnego, bez względu na typ odwołania. – Squirrelkiller

Powiązane problemy