Während eines Refactorings habe ich eine Methode wie das folgende Beispiel erstellt. Der Datentyp wurde der Einfachheit halber geändert.
Ich hatte vorher eine Zuweisungserklärung wie diese:
MyObject myVar = new MyObject();
Es wurde versehentlich umgestaltet:
private static new MyObject CreateSomething()
{
return new MyObject{"Something New"};
}
Dies war das Ergebnis eines Fehlers beim Ausschneiden / Einfügen von meiner Seite, aber das new
Schlüsselwort in private static new
ist gültig und wird kompiliert.
Frage : Was bedeutet das new
Schlüsselwort in einer Methodensignatur? Ich nehme an, es ist etwas, das in C # 3.0 eingeführt wurde.
Wie unterscheidet sich das von override
?
new
Modifikators als aa für eine Methode (oder ein anderes Element) ist nicht "etwas, das in C # 3.0 eingeführt wurde". Es ist seit der ersten Version von C # da.Antworten:
Neue Keyword-Referenz von MSDN:
MSDN-Referenz
Hier ist ein Beispiel, das ich im Internet von einem Microsoft MVP gefunden habe, das Sinn gemacht hat: Link zum Original
Override kann nur in ganz bestimmten Fällen verwendet werden. Von MSDN:
Daher wird das Schlüsselwort "new" benötigt, damit Sie nicht virtuelle und statische Methoden "überschreiben" können.
quelle
new
geht, aber ich denke, es ist buchstäblich nur zur besseren Lesbarkeit da - der Compiler warnt Sie lediglich, dass Sie beim Aufrufen einer abgeleiteten Klassenmethode mit demselben Namen wie base nicht die Methode der Basisklasse erhalten, die Sie möglicherweise erhalten Denken Sie ... es ist bizarr ... nur zur besseren Lesbarkeit?IMyInterface
implementieren, wird die Implementierung in der Derived-Klasse aufgerufen. SomitIMyInterface c = new B()
wird die Implementierung der B-Klasse aufgerufen. Wenn nur eine Klasse die Schnittstelle implementiert, wird die Methode der Klasse aufgerufen, die sie implementiert.Nein, es ist eigentlich nicht "neu" (entschuldigen Sie das Wortspiel). Es wird im Grunde genommen verwendet, um eine Methode zu "verstecken". IE:
Wenn Sie dann dies tun:
Die Methode in der Base wird aufgerufen, NICHT die in der abgeleiteten.
Weitere Informationen: http://www.akadia.com/services/dotnet_polymorphism.html
Zu Ihrer Bearbeitung: In dem Beispiel, das ich gegeben habe, wenn Sie "überschreiben" anstatt "neu" zu verwenden, dann, wenn Sie b.Method () aufrufen; Die Methode der abgeleiteten Klasse würde wegen Polymorphismus aufgerufen.
quelle
Wie andere erklärt haben, wird es verwendet, um eine vorhandene Methode auszublenden. Dies ist nützlich, um eine Methode zu überschreiben, die in der übergeordneten Klasse nicht virtuell ist.
Beachten Sie, dass das Erstellen eines "neuen" Elements nicht polymorph ist. Wenn Sie das Objekt in den Basistyp umwandeln, wird das Mitglied des abgeleiteten Typs nicht verwendet.
Wenn Sie eine Basisklasse haben:
Und dann die abgeleitete Klasse:
Wenn Sie einen Typ von deklarieren
DerivedType
und dann umwandeln, ist die MethodeDoSomething()
nicht polymorph, sondern ruft die Methode der Basisklasse auf, nicht die abgeleitete.quelle
override
in der Methodensignaturnew
der Basistyp vor dem abgeleiteten Typ verborgen ist, weil Sie nicht immer mit derbase.<type>
Notation auf den Basistyp zugreifen können ?base.<method>
und kann auch extern aufgerufen werden, wenn Sie den Basistyp in Ihrem Code umwandeln. Es ist technisch genauer, sich vorzustellen, dass die Basismethode "überschrieben" wird, als dass sie "versteckt" wird.Aus den Dokumenten:
Wenn der Methode in der abgeleiteten Klasse das neue Schlüsselwort vorangestellt wird, wird 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 über eine Methode verfügen, die dieselbe Signatur verwendet, können Sie sie als "neu" definieren, damit sie unabhängig von der übergeordneten Klasse ist. Dies bedeutet, dass diese Implementierung ausgeführt wird, wenn Sie einen Verweis auf die übergeordnete Klasse haben. Wenn Sie einen Verweis auf die untergeordnete Klasse haben, wird diese Implementierung ausgeführt.
Persönlich versuche ich, das 'neue' Schlüsselwort zu vermeiden, da es normalerweise bedeutet, dass meine Klassenhierarchie falsch ist, aber es gibt Zeiten, in denen es nützlich sein kann. Ein Ort ist für die Versionierung und Abwärtskompatibilität.
Dafür gibt es im MSDN viele Informationen .
quelle
new
, dort zu sein. Es ist syntaktisch / lesbar.Dies bedeutet, dass die Methode eine Methode mit demselben Namen ersetzt, die von der Basisklasse geerbt wurde. In Ihrem Fall haben Sie wahrscheinlich keine Methode mit diesem Namen in der Basisklasse, was bedeutet, dass das neue Schlüsselwort völlig überflüssig ist.
quelle
Lange Rede, kurzer Sinn - es ist NICHT erforderlich, es ändert KEIN Verhalten und es ist REIN für die Lesbarkeit da.
Aus diesem Grund werden Sie in VS ein wenig schnörkellos sehen, aber Ihr Code wird kompiliert und läuft einwandfrei und wie erwartet.
Man muss sich fragen, ob es sich wirklich gelohnt hat, das
new
Schlüsselwort zu erstellen, wenn der Entwickler lediglich bestätigt: "Ja, ich weiß, dass ich eine Basismethode verstecke, ja, ich weiß, dass ich nichts im Zusammenhang mitvirtual
oderoverriden
(Polymorphismus) mache. Ich möchte wirklich nur eine eigene Methode erstellen ".Es ist ein bisschen bizarr für mich, aber vielleicht nur, weil ich aus einem
Java
Hintergrund komme und es diesen grundlegenden Unterschied zwischenC#
Vererbung undJava
: In gibtJava
, sind Methoden standardmäßig virtuell, sofern nicht anders angegebenfinal
. InC#
sind Methoden standardmäßig final / konkret, sofern nicht anders angegebenvirtual
.quelle
Von MSDN :
quelle
Sei vorsichtig mit diesem Gotcha.
Sie haben eine Methode in einer Schnittstelle definiert, die in einer Basisklasse implementiert ist. Anschließend erstellen Sie eine abgeleitete Klasse, die die Methode der Schnittstelle verbirgt, die abgeleitete Klasse jedoch nicht speziell als Implementierung der Schnittstelle deklariert. Wenn Sie die Methode dann über einen Verweis auf die Schnittstelle aufrufen, wird die Methode der Basisklasse aufgerufen. Wenn Ihre abgeleitete Klasse die Schnittstelle jedoch speziell implementiert, wird ihre Methode unabhängig von der verwendeten Referenzart aufgerufen.
quelle