3 Stimmen

Hinzufügen von 'new' vor dem Rückgabetyp einer C#-Methodendefinition?

Ich bin kürzlich bei der Arbeit auf diese C#-Anweisung gestoßen:

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

Ich habe im Internet recherchiert, aber ich glaube, ich kann hier eine bessere Antwort finden.

Ich vermute, dass dies lediglich eine neue Zeichenkette mit demselben Wert zurückgibt wie die Zeichenkette, die durch den Aufruf von base.SomeFunction(i) ... ist das richtig?

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

EDITAR:
In meinem speziellen Fall, base.SomeFunction geschützt ist und NICHT virtuell... macht das einen Unterschied? Danke

9voto

Jon Skeet Punkte 1325502

Nein, es bedeutet, dass es Verstecken SomeFunction in der Basisklasse anstelle von Übergeordnetes es. Wenn es in der Basisklasse keine Methode mit der gleichen Signatur gäbe, würden Sie einen Kompilierfehler erhalten (weil Sie versuchen würden, etwas zu verstecken, das nicht vorhanden ist!)

Siehe diese Frage für weitere Informationen. (Ich glaube nicht, dass es sich hier um eine doppelte Frage handelt, denn es geht darum, wofür "neu" überhaupt steht, und nicht nur um die Warnung, wenn sie nicht vorhanden ist).

Dupliziertes Beispiel aus meiner Antwort auf diese Frage, nur um den Klick zu sparen...

Hier ist ein Beispiel für den Unterschied zwischen dem Ausblenden einer Methode und dem Überschreiben einer Methode:

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 ist:

Derived.OverrideMe
Base.HideMe

1voto

Ben M Punkte 21694

New' ist das Schlüsselwort für das Verbergen von Mitgliedern. Aus der Doku:

Bei Verwendung als Modifikator wird die neue Schlüsselwort explizit ein Mitglied das von einer Basisklasse geerbt wurde. Wenn Sie ein geerbtes Mitglied ausblenden, wird die abgeleitete Version des Elements die Version der Version der Basisklasse. Sie können zwar ohne die Verwendung des Modifikators new Modifikator ausblenden, aber das Ergebnis ist eine Warnung. Wenn Sie new verwenden, um ein Element explizit zu verstecken Member ausblenden, wird diese Warnung unterdrückt und dokumentiert die Tatsache, dass die abgeleitete Version als Ersatz gedacht ist.

1voto

Steven Sudit Punkte 19005

Die Absicht hinter Ihrem Beispielcode ist es, die Funktion im untergeordneten Programm öffentlich zu machen, obwohl sie im Basisprogramm geschützt war. Die Sprache lässt es nicht zu, dass man ein Klassenmitglied mehr sichtbar, so dass stattdessen eine neue Funktion deklariert wird, die zufällig den gleichen Namen hat. Dies verbirgt die Basisfunktion, aber andererseits hätte der Aufrufer auch keinen Zugriff auf diese Funktion gehabt, während diese Funktion die Basisfunktion aufruft.

Kurz gesagt, der Code ist ein bisschen hakelig, aber er ist sinnvoll. Es ist wahrscheinlich ein Hinweis darauf, dass die Basis möglicherweise seine Funktionalität überarbeitet werden müssen, obwohl.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X