124 Stimmen

neues Schlüsselwort in der Methodensignatur

Bei der Durchführung eines Refactorings habe ich eine Methode wie das folgende Beispiel erstellt. Der Datentyp wurde der Einfachheit halber geändert.

Ich hatte früher eine Aufgabe wie diese:

MyObject myVar = new MyObject();

Sie wurde versehentlich in diese Richtung umstrukturiert:

private static new MyObject CreateSomething()
{
  return new MyObject{"Something New"};
}

Dies war das Ergebnis eines Cut/Paste-Fehlers meinerseits, aber die new Schlüsselwort in private static new gültig und kompilierbar ist.

Frage : Was bedeutet die new Schlüsselwort in einer Methodensignatur bedeuten? Ich nehme an, es ist etwas, das in C# 3.0 eingeführt wurde?

Wie unterscheidet sich dies von override ?

115voto

Kelsey Punkte 46346

Neue Schlüsselwortreferenz von MSDN:

MSDN-Referenz

Hier ist ein Beispiel, das ich im Netz von einem Microsoft MVP gefunden habe und das sehr sinnvoll ist: Link zum Original

public class A
{
   public virtual void One();
   public void Two();
}

public class B : A
{
   public override void One();
   public new void Two();
}

B b = new B();
A a = b as A;

a.One(); // Calls implementation in B
a.Two(); // Calls implementation in A
b.One(); // Calls implementation in B
b.Two(); // Calls implementation in B

Override kann nur in ganz bestimmten Fällen verwendet werden. Aus MSDN:

Sie können eine nicht-virtuelle oder statische Methode. Die außer Kraft gesetzte Basismethode Methode muss virtuell oder abstrakt sein oder überschreiben.

Das Schlüsselwort "new" wird also benötigt, um nichtvirtuelle und statische Methoden "überschreiben" zu können.

66voto

BFree Punkte 100035

Nein, es ist nicht wirklich "neu" (entschuldigen Sie das Wortspiel). Es wird im Grunde dazu verwendet, eine Methode zu "verstecken". IE:

public class Base
{
   public virtual void Method(){}
}

public class Derived : Base
{
   public new void Method(){}
}

Wenn Sie dies tun:

Base b = new Derived();
b.Method();

Die Methode in der Base ist diejenige, die aufgerufen wird, NICHT diejenige in der abgeleiteten.

Einige weitere Informationen: http://www.akadia.com/services/dotnet_polymorphism.html

Zu Ihrer Bearbeitung: Wenn Sie in dem von mir genannten Beispiel "override" statt "new" verwenden, wird beim Aufruf von b.Method() die Methode der abgeleiteten Klasse aufgrund der Polymorphie aufgerufen.

26voto

Dan Herbert Punkte 94074

Wie andere bereits erklärt haben, wird sie verwendet, um eine bestehende Methode zu verbergen. Sie ist nützlich, um eine Methode zu überschreiben, die in der übergeordneten Klasse nicht virtuell ist.

Beachten Sie, dass die Erstellung eines "neuen" Mitglieds nicht polymorph ist. Wenn Sie das Objekt in den Basistyp umwandeln, wird es das Element des abgeleiteten Typs nicht verwenden.

Wenn Sie eine Basisklasse haben:

public class BaseClass
{
    public void DoSomething() { }
}

Und dann die abgeleitete Klasse:

public class DerivedType : BaseClass
{
    public new void DoSomething() {}

}

Wenn Sie einen Typ von DerivedType und dann gegossen, die Methode DoSomething() nicht polymorph ist, wird sie die Methode der Basisklasse aufrufen, nicht die abgeleitete.

BaseClass t = new DerivedType();
t.DoSomething();// Calls the "DoSomething()" method of the base class.

9voto

jonnii Punkte 27657

Aus den Unterlagen:

Wenn der Methode in der abgeleiteten Klasse das Schlüsselwort new vorangestellt wird, ist die Methode als unabhängig von der Methode in der Basisklasse definiert.

Was dies in der Praxis bedeutet:

Wenn Sie von einer anderen Klasse erben und eine Methode mit der gleichen Signatur haben, können Sie diese als "new" definieren, damit sie unabhängig von der Elternklasse ist. Das bedeutet, dass bei einem Verweis auf die "Eltern"-Klasse die Implementierung ausgeführt wird, bei einem Verweis auf die "Kind"-Klasse wird die Implementierung ausgeführt.

Ich persönlich versuche, das Schlüsselwort "new" zu vermeiden, da es normalerweise bedeutet, dass ich meine Klassenhierarchie falsch verstanden habe, aber es gibt Zeiten, in denen es nützlich sein kann. Zum Beispiel für die Versionierung und Abwärtskompatibilität.

Es gibt viele Informationen in den MSDN für diese .

7voto

Don Cheadle Punkte 4555

Langer Rede kurzer Sinn - es ist NICHT erforderlich, es ändert KEIN Verhalten, und es dient NUR der Lesbarkeit.

Deshalb werden Sie in VS ein kleines verschnörkeltes Bild sehen, aber Ihr Code wird kompiliert und läuft einwandfrei und wie erwartet.

Man muss sich fragen, ob es sich wirklich gelohnt hat, die new Schlüsselwort, wenn es nur bedeutet, dass der Entwickler anerkennt: "Ja, ich weiß, dass ich eine Basismethode verstecke, ja, ich weiß, dass ich nichts mit der virtual o overriden (Polymorphismus) - Ich möchte eigentlich nur eine eigene Methode erstellen".

Ich finde das ein bisschen bizarr, aber vielleicht nur, weil ich aus einer Java Hintergrund und es gibt diesen fundamentalen Unterschied zwischen C# Vererbung und Java : Unter Java sind die Methoden standardmäßig virtuell, es sei denn, sie werden durch final . Unter C# Methoden sind standardmäßig final/konkret, es sei denn, sie werden durch virtual .

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