Was ist Interface-Duck-Typing?
Hörte ich die word-Schnittstelle Duck-Typing, aber überhaupt nicht verstehen, was ist es? So lese ich in wiki über, und Sie sagte:
In computer-Programmierung mit objektorientierten Programmiersprachen, duck-typing ist ein Stil der Typisierung, in denen ein Objekt die Eigenschaften und Methoden Bestimmung der gültigen Semantik, anstatt sein Erbe von einer bestimmten Klasse oder die Implementierung einer expliziten Schnittstelle. Der name des Konzepts bezieht sich auf die Ente zu testen.
Konnte aber immer noch nicht verstehen, was es. So sah ich Ihr Programm, aber Sie nutzen dynamic
Stichwort zu nennen quack()
& feather()
Funktion alle Klassen.
Ich würde verlangen, dass Sie alle erklären Sie bitte in einfachen Weg, was ist Interface-Duck-Typing und wie die Umsetzung in C# v2.0, weil es keine dynamic
Schlüsselwort.
using System;
namespace DuckTyping
{
public class Duck
{
public void Quack()
{
Console.WriteLine("Quaaaaaack!");
}
public void Feathers()
{
Console.WriteLine("The duck has white and gray feathers.");
}
}
public class Person
{
public void Quack()
{
Console.WriteLine("The person imitates a duck.");
}
public void Feathers()
{
Console.WriteLine("The person takes a feather from the ground and shows it.");
}
}
internal class Program
{
private static void InTheForest(dynamic duck)
{
duck.Quack();
duck.Feathers();
}
private static void Game()
{
Duck donald = new Duck();
Person john = new Person();
InTheForest(donald);
InTheForest(john);
}
private static void Main()
{
Game();
}
}
}
- ericlippert.com/2014/01/02/what-is-duck-typing
- Sie können nicht (gut, es sei denn, Sie tun hässliches Spiegelbild), duck typing ist einzigartig für dynamische Sprachen und nicht wirklich eine ganze Menge Sinn für mich in statisch typisierten Sprachen. Ich würde sagen, die Java-und Groovy-Beispiele sind besser, als Sie tatsächlich zeigt ein Mensch, dass Kann nicht quaken... Weil die meisten Allgemeine Konsens ist, dass wenn es "quack" es ist eine Ente... Bedeutung Ihrer Person ist auch eine Ente, wie er kann "Quack"... das Ergebnis seiner Fähigkeit zu "Quack" ist vielleicht anders, aber er kann es noch.
- Go ist statisch typisiert, sondern benutzt duck typing für Schnittstellen. Ein wirklich tolles feature, IMO.
- Ich weiß nicht, aber es klingt wie eine Sprache, die wie viele andere hat er den Fuß in beiden lagern... (Das ist toll, btw.)... Typoskript tut viel die gleiche Sache, so im wesentlichen ich denke, Sie haben Recht, es kann Sinn machen...
- ist es ähnlich ADAPTER-MUSTER ?
- "Wenn es quakt wie eine Ente, Spaziergänge wie eine Ente, ist es eine Ente". C# verwendet, duck-typing (von was ich sagen kann) mit der foreach -, check-out-Abschnitt 8.8.4
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bitte wenden Sie sich mit diesem um eine Vorstellung zu bekommen über Duck Typing
http://haacked.com/archive/2007/08/19/why-duck-typing-matters-to-c-developers.aspx/
C# hat eine nominelle Art system, so dass die Kompatibilität von Typen erfolgt nach Ihren Namen. In Ihrem Beispiel haben Sie zwei Klassen mit einer
Quack
Methode, aber es ist kein Weg zu schreiben, eine Methode, die Instanzen der beiden Klassen und berufen, IhreQuack
Methode.In C# 2, die Lösung wäre die Einführung eines interface und beide Klassen implementieren:
nun können Sie eine Methode erstellen, die einen
IQuack
- Instanz und rufenHuman.Quack
undDuck.Quack
durch. In C# Methoden gelöst werden 'früh' zur compile-Zeit, so müssen Sie einen Namen geben, das diese Vorgänge unterstützt die Methode müssen, damit die Kompilierung erfolgreich ausgeführt werden können. Hinweis: es ist immer noch ein runtime-element zum aufrufen dieser Methoden, die seit der realen Umsetzung derIQuack.Quack
aufgelöst werden muss, zur Laufzeit abhängig von den tatsächlichen Typ von argument.In einer duck-typing-system, kein Versuch ist gemacht, um zu überprüfen, ob eine Methode vorhanden ist, vor der Laufzeit. Alles, was erforderlich ist, dass ein bestimmtes Objekt unterstützt die Bedienung, dass es das Recht hat, Namen und nimmt sich die erforderliche Anzahl der Parameter (allerdings nicht in diesem Fall), daher das "wenn es quakt wie eine Ente" Ausdruck.
Duck typing in C# 2 kann nur mittels Reflexion, in diesem Fall würden Sie akzeptieren eine
object
argument und die erforderlichen Methoden selbst:C#4 macht dies sehr viel einfacher mit
dynamic
:dynamic
, können Sie bitte ein weiteres Beispiel für eine "dynamische" Ente? Ich wäre besonders daran interessiert, wie es zu handhaben, wenn die Methode in der vergangen "Ente" parameter existiert nicht.MakeQuack
eine exception werfen, wenn keine Methode vorhanden ist, um es mehr im Einklang mit derdynamic
version.Quack
, während die dynamische Variante nur Anrufe die nicht-statische.Er würde sagen, es ist eine Möglichkeit, die Codierung, wo die Sie sagen dem compiler:
"Hey, Vertrauen Sie mir, ich weiß, was Methoden und Eigenschaften, die dieses Objekt unterstützt. Sie nicht brauchen, um zu überprüfen, Ihnen für mich, während ich code."
Sobald Sie Ihre app durch den compiler gehen:
"Ok, mal sehen, ob ich könnte Ihnen Vertrauen. Lassen Sie mich einige laufzeitbindung."
Wenn Sie dann einen Fehler gemacht, wie die Verwendung einer nicht unterstützten Methode, der compiler Schreien: "Hey Mann, dieses wird nicht unterstützt! Überprüfen Sie meine RuntimeBinderException!"
Über Duck Typing:
Beispiel:
Beispiel, wenn Sie hier sind die Dinge, die wir wollen, dass die folgenden Objekte.
Und hier ist das Ergebnis nach der wir verlangen, dass die oben genannten Objekte, die Dinge tun.
So, wir brauchen nicht zu prüfen, was das Objekt ist, aber wir können es tun, etwas, genug. Hier ist der code, den ich geschrieben habe in C#.
@Ewald Stieger @Patrick Frombork @Lee @John Pluto-Lösungen @tarzanbappa @Thomas @BartoszKP können Sie Ereignisse und nutzen C# am besten geeignet überlast-Funktionen.
Hoffentlich wird es nützlich sein 🙂
Um etwas zu bekommen, Wie eine duck-typing (.Net 4.+):