C# - Schlüsselwort Verwendung virtueller+überschreiben vs. neue
Was sind die Unterschiede zwischen der Deklaration einer Methode in einer Basis-Typ "virtual
" und überschreiben Sie es in ein Kind-Typ mit dem " override
" - Schlüsselwort im Gegensatz zu einfach mit dem "new
" Schlüsselwort bei der Deklaration der matching-Methode in der child-Typ?
MSDN sagen "Mit
finden Sie unter diesem stackoverflow.com/questions/17717570/...
MSDN - msdn.microsoft.com/en-us/library/ms173153.aspx
new
erstellt ein neues Element mit dem gleichen Namen und bewirkt, dass die original-Mitglied zu werden, versteckt, während override
erstreckt sich die Implementierung für eine geerbte member"finden Sie unter diesem stackoverflow.com/questions/17717570/...
MSDN - msdn.microsoft.com/en-us/library/ms173153.aspx
InformationsquelleAutor i3ensays | 2008-10-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem Schlüsselwort "new" nicht überschreiben, es bedeutet eine neue Methode, hat nichts zu tun mit der Basis-Klasse-Methode.
Diese Drucke false", wenn Sie überschreiben, es würde gedruckt haben wahr.
(Basis-code genommen von Joseph Daigle)
So, wenn Sie tun, real Polymorphismus Sie SOLLTE IMMER Vorrang. Der einzige Ort, wo Sie brauchen, um über "neu" ist, wenn die Methode ist nicht in irgendeiner Weise einen Bezug zu der Basis-Klasse-version.
Danke, ich habe den "statischen" Teil. Sollten mehr Aufmerksamkeit auf die Zukunft
Beachten Sie, dass die Zeile Foo test = new Bar () ist hier entscheidend, die neuen / override-Schlüsselwort für die metods bestimmen, welche metod aufgerufen wird, wenn man eine Bar in eine variable Foo.
... es ist also genau das gleiche wie einfach nicht
virtual
im Boden und in deroverride
im abgeleitet? Warum gibt es ihn? Der code wird weiterhin ausgeführt, selbst w/onew
- so ist es rein nur die Lesbarkeit?Deine Antwort sehr geehrter Herr, ist ziemlich vage. neue und virtual-überschreiben tun die ziemlich gleiche, der einzige Unterschied ist, dass die neuen VERBIRGT sich die Methode in der übergeordneten Klasse und überschreiben.. naja, überschreibt es. Natürlich druckt es falsch, weil Sie Ihre test-Objekt vom Typ Foo, wenn Sie in der Art Bar, es drucken würde wahr. Ziemlich tricky Beispiel, wenn.
InformationsquelleAutor albertein
Finde ich immer, dass Dinge wie diese leichter verstanden werden mit Bildern:
Wieder, unter joseph daigle code,
Wenn Sie rufen dann den code wie folgt:
HINWEIS: Das wichtigste ist, dass unser Objekt ist tatsächlich eine
Bar
, aber wir sind speichern es in eine variable vom TypFoo
(dies ist ähnlich wie das casting)Dann wird das Ergebnis wie folgt, je nachdem, ob Sie verwendet werden
virtual
/override
odernew
bei der Deklaration von Klassen.Hoppla, Wenn vergaß hinzuzufügen, diese wenigen Zeile zu meinem vorherigen. Kommentar: meinst du virtual/überschreiben und nicht-virtuelle/neue verwendet werden, nur für polymorphysm Konzept und wenn du einfach eine variable deklarieren (nicht Gießen) die Sie nicht so meinen? Nochmals vielen Dank.
diese Antwort ist genau das, was ich suchte. Das einzige problem das ich hatte ist, dass flickr-Bilder gesperrt an meinem Arbeitsplatz, so hatte ich Zugriff über mein Handy...
Echte Anstrengungen, um die Frage zu beantworten.
Ich würde upvote, wenn Sie können, beheben Sie die Bild? Seine blockiert hinter corp firewall...
InformationsquelleAutor Orion Edwards
Hier ist etwas code zu verstehen, den Unterschied im Verhalten der virtuellen und nicht-virtuellen Methoden:
new
zu "verstecken" die base-Methode, wenn Sie einfach nicht mit überschreiben scheint das gleiche zu tun?Ich glaube nicht, dass es wurde geschaffen, um zu verhindern, dass der Basisklasse wird überschrieben. Ich denke, es wurde geschaffen, um zu vermeiden, den Namen, die widerstreitenden, wie Sie können nicht außer Kraft gesetzt, eine Methode, die nicht
virtual
und der compiler wird sich beschweren, wenn es sieht, den gleichen Funktionsnamen in einer Klasse zu "bloodline" ohnevirtual
SignaturInformationsquelleAutor Franci Penov
Den
new
keyword tatsächlich schafft ein komplett neues Element, das existiert nur auf diesem bestimmten Typ.Beispielsweise
Die Methode vorhanden ist, auf beide Arten. Wenn Sie Reflexion und erhalten die Mitglieder vom Typ
Bar
, werden Sie tatsächlich finden Sie 2 Methoden mit dem NamenDoSomething()
, die genau gleich Aussehen. Durch die Verwendungnew
Sie wirksam ausblenden und die Implementierung in der Basisklasse, so dass, wenn Klassen stammen ausBar
(in meinem Beispiel) die Methode aufrufen, umbase.DoSomething()
gehtBar
und nichtFoo
.InformationsquelleAutor Joseph Daigle
virtual /override teilt dem compiler mit, dass die beiden Methoden in Zusammenhang stehen, und dass in einigen Fällen, wenn Sie glauben, Sie sind dem Aufruf der ersten (virtuellen) Methode ist es tatsächlich richtig, zu nennen, die zweite (überschriebene) Methode statt. Dies ist die Grundlage der Polymorphie.
Rufen die Unterklasse ist überschrieben VirtualFoo () - Methode.
neue weist den compiler an, den Sie hinzufügen einer Methode einer abgeleiteten Klasse mit dem gleichen Namen wie eine Methode in der Basisklasse, aber Sie haben keine Beziehung zueinander.
Rufen die BaseClass ' s NewBar () - Methode, in Erwägung nachstehender Gründe:
Rufen die Unterklasse der NewBar () - Methode.
die Stiftung "Polymorphismus" ist ein weiteres stilvolles sagen 🙂
InformationsquelleAutor Wedge
Mehr als nur die technischen details, ich denke, mit virtual/override kommuniziert, eine Menge von semantischen Informationen über das design. Wenn Sie eine Methode deklariert virtual, zeigen Sie an, dass Sie erwarten, dass implementierende Klassen können wollen, um Ihre eigenen, nicht-Standard-Implementierungen. Das weglassen dieser in eine Basis-Klasse, ebenso, erklärt der Erwartung, dass die Standard-Methode sollte für alle ausreichen implementierende Klassen. Ebenso kann man abstrakte Erklärungen zu zwingen, die Implementierung von Klassen, um Ihre eigene Implementierung bereitstellen. Nochmals, ich denke dies vermittelt eine Menge darüber, wie der Programmierer erwartet, dass der code verwendet werden. Wenn ich schreiben würde sowohl die base und Implementierung von Klassen-und mich selbst gefunden mit neuer würde ich ernsthaft überdenken der Entscheidung nicht um die virtuelle Methode in der übergeordneten und erkläre meine Absicht ausdrücklich.
InformationsquelleAutor tvanfosson
Den Unterschied zwischen dem Schlüsselwort override und new-Schlüsselwort ist, dass der ehemalige hat Methode überschreiben und die später-Methode versteckt.
Check-out die folgenden links für weitere Informationen...
MSDN und Andere
InformationsquelleAutor Nescio
new
Schlüsselwort ist, zu Verbergen. bedeutet für Sie verstecken Sie Ihre Methode zur Laufzeit. Die Ausgabe basiert Basisklasse Methode.override
zu überschreiben. - bedeutet, Sie sind Berufung auf die abgeleitete Klasse die Methode mit der Referenz der Basisklasse. Die Ausgabe wird basierend auf der abgeleiteten Klasse die Methode.InformationsquelleAutor Chetan
Meine version der Erklärung kommt aus der Verwendung Eigenschaften zu helfen, zu verstehen, die Unterschiede.
override
ist einfach genug, richtig ? Der zugrunde liegende Typ überschreibt der Eltern.new
ist vielleicht irreführend (für mich). Mit Eigenschaften, die es einfacher zu verstehen:Mit einem debugger können Sie feststellen, dass
Foo foo
hat 2GetSomething
Eigenschaften, wie es eigentlich 2 Versionen von der Eigenschaft,Foo
's undBar
's, und zu wissen, welche zu benutzen, c# "picks" die Eigenschaft für den aktuellen Typ.Wenn Sie wollte die Bar ist die version, die Sie verwendet haben würde, überschreiben oder verwenden Sie
Foo foo
statt.Bar bar
hat nur 1, wie es will, völlig neue Verhalten fürGetSomething
.InformationsquelleAutor Dror Weiss
Nicht die Kennzeichnung einer Methode mit alles bedeutet: Binden diese Methode über das Objekt kompilieren Typ, nicht-runtime-Typ (statische Bindung).
Kennzeichnung einer Methode mit
virtual
bedeutet: Binden diese Methode mit dem Objekt, der Laufzeit-Typ, keine compile-Zeit-Typ (dynamische Bindung).Kennzeichnung einer Basis-Klasse
virtual
Methode mitoverride
in der abgeleiteten Klasse bedeutet: Dies ist die Methode gebunden zu sein, über das Objekt-runtime-Typ (dynamische Bindung).Kennzeichnung einer Basis-Klasse
virtual
Methode mitnew
in der abgeleiteten Klasse bedeutet: Dies ist eine neue Methode,, die hat keine Beziehung zu dem einen mit dem gleichen Namen in der Basisklasse und es sollte gebunden werden, mit Objekt compile-Zeit-Typ (statische Bindung).Nicht kennzeichnet eine Basis-Klasse
virtual
Methode in der abgeleiteten Klasse bedeutet: Diese Methode markiert ist, alsnew
(statische Bindung).Kennzeichnung einer Methode
abstract
bedeutet: Diese Methode ist virtuell, aber ich werde nicht erklären, einen Körper für ihn und seine Klasse ist ebenfalls Abstrakt (dynamische Bindung).InformationsquelleAutor Emre Tapcı