Schatten vs Überlastungen in VB.NET
Wenn wir new
in C#, dass ich persönlich sehen nur als workaround zu überschreiben einer Eigenschaft, die nicht über eine virtual/overridable Erklärung, in VB.NET wir haben zwei "Konzepte" Shadows
und Overloads
.
In dem Fall lieber einen anderen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es drei eng Verwandte Konzepte; überschreiben, shadowing und überladen.
Überschreiben ist, wenn man eine neue Implementierung für virtuelle Methode.
Shadowing ist, wenn Sie eine neue nicht-virtuellen Implementierung für eine Methode.
Überlastung ist, wenn Sie fügen Sie eine Methode mit dem gleichen Namen, aber unterschiedlichen Parametern.
Alle drei Konzepte sind sowohl in C# und VB.
Shadows
schafft eine "neue" Funktion, undOverloads
ist (sein kann) verwendet für den gleichen Anwendungsbereich. also, was ist der Unterschied.Overloads
Schlüsselwort, um Schattenbildung es ist immer noch shadowing, die Sie tun. Die Konzepte bleiben die gleichen, auch wenn die VB-Schlüsselwörter überlappen.Overloads
Schlüsselwort zu sein scheint, verwendbar für die meisten Situationen, mit denen Sie dieShadows
Stichwort, ich würde empfehlen, dass Sie das keyword, das entspricht dem aktuellen Konzept, das Sie verwenden, das macht den code leichter zu Lesen.Habe ich eigentlich bestätigt durch das kompilieren der gleiche code mit
Shadows
vsOverloads
für eine Methode mit identischem Namen und Unterschrift in der Basisklasse und den Blick auf die Ausgabe vonildasm
für beide. Der einzige Unterschied ist dieOverloads
Fall gibthidebysig
.Diese Bedeutung wird am besten erklärt durch Jon Skeet in diese Antwort.
Aber einfach, es bedeutet, es gibt nur einen echten Unterschied, wenn die Basisklasse überladungen der Methode neu definiert:
Shadows
verursachen alle dieseüberlastungen werden durch uncallable
die abgeleitete Klasse, wo, wie
Overloads
ersetzt nur die eine Methode.Beachten Sie, dass dies nur eine Sprache konstruieren-und nicht erzwungen durch das CLI (z.B. C# und VB.NET dies durchzusetzen, aber andere Sprachen auch nicht).
Einem einfachen code-Beispiel:
Die Ausgabe des obigen:
Zeigt die Ausgabe der
Shadows
Anrufe verwendet werden, wennC2
direkt aufgerufen wird und nicht beim Aufruf indirekt überC1
.Shadows
ist für Fälle, in denen Sie Ihre Basis-Klasse istFunction SomeMethod() As String
haben wollenFunction SomeMethod() As Integer
. Im Grunde ändern Sie den Rückgabetyp.Overloads
ist für den Fall, wo Sie Ihre Basis-Klasse istFunction SomeMethod() As String
und Sie möchten, um einen parameter hinzuzufügen, wieFunction SomeMethod(ByVal value As Integer) As String
.