2009-11-13 5 views
17

Nach einem Blick auf, wie Go Schnittstellen behandelt und mag es, begann ich darüber nachzudenken, wie Sie ähnliche Ente-Typisierung in C# wie dies erreichen könnten:Implementierung sichere duck-Typisierung in C#

Die DuckTyper.Adapt Methode verwenden würde System.Reflection.Emit um einen Adapter im laufenden Betrieb zu bauen. Vielleicht hat jemand schon so etwas geschrieben. Ich denke, es ist nicht viel anders als das, was spöttische Frameworks schon tun.

Allerdings würde dies zur Laufzeit Ausnahmen auslösen, wenn Mallard nicht die richtigen IDuck Methoden hat. Um den Fehler früher zur Kompilierzeit zu bekommen, müsste ich eine MallardToDuckAdapter schreiben, die genau das ist, was ich vermeiden möchte.

Gibt es einen besseren Weg?

bearbeiten: anscheinend der richtige Begriff für das, was ich "sichere Ente-Typisierung" nennen, ist structural typing.

+0

Ich habe dies schon vorher gewünscht und das system.xml.serialization-System so angepasst, dass es mit den generischen system.runtime.serialization-Formatierern funktioniert. –

+1

Außerdem: überprüft Go das zur Kompilierzeit oder nur zur Laufzeit? Wenn Letzteres, sie haben keine neuen Lösungen für das Problem zur Verfügung gestellt, nur die zusätzlichen Adapt-Code, den Sie bereits erwähnt. –

+0

Yeah, das Schreiben des Adapters würde nicht als Duck Typisierung gelten, denn es ist normale C# Eingabe ... –

Antwort

13

Wie können Sie wissen, ob eine Kuh wie eine Ente läuft und wie eine Ente quakt, wenn Sie keine lebende, atmende Kuh vor sich haben?

Duck-Typisierung ist ein Konzept, das zur Laufzeit verwendet wird. Ein ähnliches Konzept zur Kompilierungszeit ist structural typing, wobei AFAIK nicht von der CLR unterstützt wird. (Die CLR ist um nominative typing zentriert.)

[A-Strukturtyp System] im Gegensatz zu Nominativ Systemen, in denen Vergleiche basieren auf ausdrückliche Erklärungen oder die Namen der Arten und Ente eingeben, in dem nur der Teil Die zur Laufzeit aufgerufene Struktur wird auf Kompatibilität geprüft.

Die übliche Methode, um sicherzustellen, dass Duck-Typing zur Laufzeit keine Ausnahme auslöst, sind Unit-Tests.

+0

In Go wird die Duck-Typisierung statisch verifiziert. Der Compiler betrachtet die Cow-Klasse und beschwert sich, wenn sie nicht über die Duck-Methode verfügt. –

+3

Das ist genau die Definition der strukturellen Vererbung :-) – dtb

+0

In .NET wird Ente Typisierung anders als die übliche Bedeutung des Begriffs verwendet. Leider ist das Umbenennen etablierter Fachbegriffe bei Microsoft (oder zumindest in der CLR-Abteilung) zu einer Art Firmenhobby geworden, was extrem ärgerlich ist. –

5

DuckTyping for C#

Reflection.Emit verwendet wird IL auszusenden, dass das ursprüngliche Objekt

ich diese Bibliothek Sie Zeitfehler gedacht kompilieren geben glaube nicht direkt anruft, bin ich nicht sicher, das wäre durchaus machbar. Verwenden Sie Komponententests, um das auszugleichen.

+2

Veröffentlicht unter der Artistic License 2.0! –

+0

+1 Ich mag die Idee, Komponententests hier zu verwenden. Auf diese Weise handeln Sie mit dem (möglicherweise großen) Aufwand beim Schreiben einer Adapterklasse für den geringen Aufwand beim Schreiben eines einzeiligen Komponententests. –

1

Ich glaube nicht, dass es einen anderen Weg gibt, auf dem Sie einen Kompilierzeitfehler bekommen würden.

Dies ist jedoch etwas, das Unit Testing ist gut für. Sie würden einen Komponententest schreiben, um zu verifizieren, dass

DuckTyper.Adapt<Mallard, IDuck>(mallard); 

erfolgreich zugeordnet wird.

1

Ich weiß, dass implizite Schnittstellen (was Go-Schnittstellen sind) für VB 10 geplant wurden (keine Ahnung von C#). Leider wurden sie vor der Veröffentlichung verschrottet (ich denke, sie haben es nicht einmal in die Betaversion geschafft ...). Es wäre schön zu sehen, ob sie in einer zukünftigen Version von .NET erscheinen werden.

Natürlich können die neuen dynamic Typen verwendet werden, um das gleiche zu erreichen, aber das ist immer noch nicht das Gleiche - implizite Schnittstellen erlauben immer noch starke Typisierung, was ich wichtig finde.

+0

Können Sie Links bereitstellen, die Ihren Anspruch bezüglich impliziter Schnittstellen in VB unterstützen? – Dario