2009-07-23 5 views
3

So lief ich vor kurzem in diese C# Aussage bei der Arbeit:Hinzufügen von 'neu' vor dem Rückgabetyp der C# -Methodendefinition?

public new string SomeFunction(int i) 
{ 
    return base.SomeFunction(i); 
} 

ich das Web durchsucht, aber ich denke, dass ich hier eine bessere Antwort finden kann.

Nun, ich vermute, dass all dies tut, ist eine neue Zeichenfolge mit dem gleichen Wert wie die Zeichenfolge zurückgegeben durch den Aufruf an base.SomeFunction(i) ... ist das korrekt?

Gibt es diese Funktion auch in anderen Sprachen (speziell Java)?

EDIT:
In meinem speziellen Fall, base.SomeFunction geschützt und NICHT virtuelle ... bedeutet dies einen Unterschied machen? Dank

+0

die anwsers zu einer Frage, die ich vor einiger Zeit fragte, könnte auch hilfreich sein: http://stackoverflow.com/questions/1014853/c-public-new-string-tostring-vs-public-override-string-tostring – marcgg

Antwort

9

Nein, bedeutet dies, dass es SomeFunction in der Basisklasse versteckt anstatt es überschrieben. Wenn es keine Methode in der Basisklasse mit der gleichen Signatur gäbe, würden Sie einen Fehler bei der Kompilierung bekommen (weil Sie etwas verstecken wollten, das nicht da war!)

Siehe this question für mehr Information. (Ich denke nicht, dass dies eine doppelte Frage ist, da es darum geht, was "neu" ist, anstatt nur über die Warnung zu sprechen, wenn sie abwesend ist.)

Duplikate Beispiel von meiner Antwort auf diese Frage, nur die Click-through ...

Hier ist ein Beispiel für den Unterschied zu speichern, ein Verfahren zwischen versteckt und überschreibt es:

using System; 

class Base 
{ 
    public virtual void OverrideMe() 
    { 
     Console.WriteLine("Base.OverrideMe"); 
    } 

    public virtual void HideMe() 
    { 
     Console.WriteLine("Base.HideMe"); 
    } 
} 

class Derived : Base 
{ 
    public override void OverrideMe() 
    { 
     Console.WriteLine("Derived.OverrideMe"); 
    } 

    public new void HideMe() 
    { 
     Console.WriteLine("Derived.HideMe"); 
    } 
} 

class Test 
{ 
    static void Main() 
    { 
     Base x = new Derived(); 
     x.OverrideMe(); 
     x.HideMe(); 
    } 
} 

die Ausgabe lautet:

Derived.OverrideMe 
Base.HideMe 
+0

Wie würde abgeleitet werden.HideMe jemals dann getroffen werden? – Polaris878

+0

Durch Deklaration der Variablen vom Typ Abgeleitet anstelle von Basis. –

+0

haha ​​ich habe das in deinem Code verpasst. Macht Sinn, vielen Dank – Polaris878

1

‚n ew 'ist das Schlüsselwort zum Ausblenden von Mitgliedern. Aus der Dokumentation:

Wenn sie als Modifikationsmittel verwendet, das neue Stichwort verbirgt explizit Mitglied von einer Basisklasse geerbt. Wenn Sie ein geerbtes Mitglied ausblenden, ersetzt die abgeleitete Version des Mitglieds die Basisklasse Version. Obwohl Sie Mitglieder ausblenden können, ohne den neuen Modifikator zu verwenden, ist das Ergebnis eine Warnung. Wenn Sie new verwenden, um ein Member explizit auszublenden, unterdrückt es diese Warnung und dokumentiert die Tatsache, dass die abgeleitete Version als Ersatz gedacht ist.

1

Die Absicht hinter Ihrem Beispielcode besteht darin, die Funktion im untergeordneten Element zu veröffentlichen, obwohl sie in der Basis geschützt war. Die Sprache lässt Sie nicht ein Klassenmitglied mehr im Child sichtbar machen, so dass dies stattdessen eine neue Funktion deklariert, die zufällig denselben Namen hat. Dadurch wird die Basisfunktion ausgeblendet, aber der Aufrufer hätte zuvor noch keinen Zugriff darauf, während diese Funktion den Aufruf in der Basis aufruft.

Kurz gesagt, der Code ist ein bisschen ein Hack, aber es macht Sinn.Es ist wahrscheinlich ein Hinweis, dass die Funktionalität der Basis möglicherweise überarbeitet werden muss.

Verwandte Themen