2016-07-14 7 views
0

Neulich habe ich diese Aussage in einem Stackoverflow Post gefunden in Zusammenhang mit Erweiterungsmethoden:Erweiterungsmethoden und Methode überschrieben

Die Hauptsache ist es Fähigkeit, verschiedene Methoden, die auf verschiedenen generic-Parameter Instanziierung außer Kraft zu setzen ist. Dies ist vergleichbar mit Haskells Typklassen

Java equivalent to C# extension methods

Was soll das heißen? Kann jemand ein bedeutendes Beispiel geben, das diese Aussage verdeutlicht?

+0

Warum fragst du das Originalplakat nicht nach dieser Frage oder fragst nach Klärung. – GreatAndPowerfulOz

+0

Für welchen Teil der Frage suchen Sie eine Klarstellung? Würden Sie gerne klären, welche C# -Erweiterungen, wie sie verwendet werden oder wie sie den Haskell-Typen ähnlich sind? –

+0

Ich bin mit Erweiterungsmethoden vertraut. Ich verstehe das übergeordnete Ding nicht, das auf "der Instanziierung der generischen Parameter" basiert. Das ist mein zentrales Thema. Wenn ein Vergleich zu Haskells Typenklassen helfen kann, das Konzept zu erklären, würde ich es begrüßen. – Olaf

Antwort

1

Ich nehme an, dass sie sich auf die Tatsache beziehen, dass der C# -Compiler die Methode wählt, die den Typ am engsten definiert. So zum Beispiel, wenn Sie eine abstrakte Klasse (ABS) und eine vererbte Klasse (CLS2) und 2 Erweiterungsmethoden

public static object GetStuff(this ABS obj){ 
    blah blah blah 
} 

    public static object GetStuff(this CLS obj){ 
    blah blah blah 
} 

, wenn Sie die CLS2.GetStuff() aufrufen, wird der Compiler die zweite Methode wählen. Sobald Sie wissen, dass Sie eine Erweiterungsmethode "überschreiben" können, indem Sie sie spezifischer machen. Also, wenn Sie eine generische Klasse haben

public class Foo<T>{} 

Sie 2 Erweiterungsmethoden machen könnten (unter Verwendung von Klassen von oben als Typ)

public static void DoSomething(this Foo<Abs> abs){} 

und

public static void DoSomething(this Foo<CLS2> abs){} 

Hier ist die zweite Methode „Übergeordnete "der mehr" generische "abstrakte Typ.

Dies ist nur möglich mit C#, weil es tatsächlich eine neue Klasse für jeden generischen Typ generiert. Bei einer Sprache wie Java, in der "Type Erasure Generics" verwendet wird, kann man die generische Methode nicht "überladen", da alles wirklich Typ Object unter der Haube ist.

+0

C# *** erzeugt keine neue Klasse für jeden generischen Typ; Dies geschieht nur für jede Verwendung des generischen Typs mit einer Strukturinstanziierung des generischen Typparameters. Alle Instanzen des generischen Typparameters teilen dieselbe Klasseninstanz. link: https://msdn.microsoft.com/en-us/library/f4a6ta2h.aspx: "* Wenn ein generischer Typ zuerst mit einem Werttyp als Parameter erstellt wird, erstellt die Laufzeitumgebung einen spezialisierten generischen Typ mit dem angegebenen Parameter oder Parameter, die an den entsprechenden Stellen in der MSIL ersetzt wurden. * " –

+0

Fortsetzung:" * Generics funktionieren für Referenztypen etwas anders: Wenn ein generischer Typ zum ersten Mal mit einem beliebigen Referenztyp konstruiert wird, erstellt die Laufzeit einen spezialisierten generischen Typ mit Objektreferenzen Wenn jedes Mal, wenn ein konstruierter Typ mit einem Referenztyp als Parameter instanziiert wird, unabhängig davon, um welchen Typ es sich handelt, verwendet die Laufzeitumgebung die zuvor erstellte spezialisierte Version des generischen Typs alle Referenzen haben die gleiche Größe. * " –

+0

Semantik (Obwohl ich zugeben werde, dass ich das vorher nicht gewusst habe).Mein Punkt ist, dass Sie mit dem tatsächlichen Typ im Gegensatz zu Typ löschen beschäftigen –

Verwandte Themen