Aus dem Polymorphismus auf Wikipedia
In der Informatik ist Polymorphismus eine Programmiersprache, mit der Werte verschiedener Datentypen über eine einheitliche Schnittstelle verarbeitet werden können.
Von der Ente, die auf Wikipedia schreibt
In der Computerprogrammierung mit objektorientierten Programmiersprachen ist die Ententypisierung ein dynamischer Typisierungsstil, bei dem der aktuelle Satz von Methoden und Eigenschaften eines Objekts die gültige Semantik bestimmt und nicht die Vererbung von einer bestimmten Klasse oder Implementierung einer bestimmten Schnittstelle.
Meine Interpretation ist, dass die Objektmethoden / -eigenschaften basierend auf der Ententypisierung die gültige Semantik bestimmen. Dies bedeutet, dass die aktuelle Form des Objekts die Schnittstelle bestimmt, die es unterstützt.
Vom Polymorphismus kann man sagen, dass eine Funktion polymorph ist, wenn sie mehrere verschiedene Datentypen akzeptiert, solange sie eine Schnittstelle aufrecht erhält.
Wenn eine Funktion den Typ "Duck" annehmen kann, kann sie mehrere verschiedene Datentypen akzeptieren und auf diese zugreifen, sofern diese Datentypen die richtigen Methoden / Eigenschaften aufweisen und somit die Schnittstelle aufrechterhalten.
(Die Verwendung des Begriffs Schnittstelle ist nicht als Codekonstrukt, sondern als beschreibendes, dokumentierendes Konstrukt zu verstehen.)
- Was ist das richtige Verhältnis zwischen Ententypisierung und Polymorphismus?
- Wenn eine Sprache Ententyp kann, heißt das, dass sie Polymorphismus kann?
door.close()
andtiger.close()
Antworten:
Ich sage, dass Polymorphismus ein generisches Merkmal ist, das auf verschiedene Arten implementiert werden kann:
Jeder von ihnen ermöglicht es dem Programmierer, einen einzigen Code mit unterschiedlichen Typen zu verwenden, sodass alle das Konzept des Polymorphismus verkörpern.
quelle
Ich denke, dass:
Sowohl Ententypisierung als auch Polymorphismus sind Mittel zur Indirektion / Abstraktion. Polymorphismus ist ein Konzept, das auf Typen und Typisierung basiert, während Ententypisierung auf Verträgen basiert.
Beim Polymorphismus ist es wichtig, was das DING ist und nicht, wie es sich verhält (es kann die Folge dessen sein, was es ist).
Bei der Eingabe von Enten ist es wichtig, wie sich ein DING verhält. Duck Typing ist mehr an das Konzept von Objekten als Akteure gebunden, die Nachrichten austauschen, als an Objekte, die bestimmte Eigenschaften haben.
quelle
Die Antwort lautet JA .
Duck Typing ist ein Sonderfall der dynamischen Typisierung , und selbst wenn die dynamische Typisierung per se nicht direkt als Polymorphismus betrachtet werden kann (da es nur die Eigenschaft der Sprache ist, die Typüberprüfung zur Laufzeit und nicht zur Kompilierungszeit durchzuführen), die normalerweise angewendet werden Diese späte Bindung und der dynamische Versand sind für den Polymorphismus charakteristisch, der der dynamischen Typisierung zugrunde liegt .
quelle
Das Tippen von Enten ist keine Teilmenge des Polymorphismus, da Polymorphismus explizite Aussagen erfordert, die beim Tippen von Enten verloren gehen. Entenschreiben hat also die Chance, eine "Schnittstelle" zu "implementieren", nicht weil es semantisch sinnvoll ist, sondern weil Sie die gleiche Signatur haben. Wenn Ententypisierung eine Teilmenge des Polymorphismus wäre, hätte sie alle Eigenschaften des Polymorphismus, einschließlich der expliziten Deklaration.
Duck Typing ist auch keine wirkliche Implementierung von Polymorphismus, sondern Teil eines anderen Typsystems. Normalerweise assoziieren Sie das Tippen auf Enten mit einer dynamischen Sprache, die fortfährt und eine Nachricht an ein Objekt weitergibt, ohne zu wissen, ob das Objekt damit umgehen kann. Wenn dies möglich ist, hat es den Test zum Tippen auf Enten erfolgreich bestanden. Normalerweise wird Polymorphismus beim Kompilieren durch das Einrichten von vtables (und von itables, wenn sich die Schnittstellen von den Klassen unterscheiden) implementiert. Aber es gibt VIELE Sprachen und viele Möglichkeiten, diese Funktionen zu implementieren.
Bis zu einem gewissen Grad ist dies eine philosophische Frage. Können Sie sich Enten-Typisierung als Schnittstellen vorstellen, die automatisch implizit deklariert werden? Ich kann mir keinen Grund vorstellen , der genau falsch ist, aber ich denke nicht, dass dies wahrscheinlich die produktivste Art ist, es zu betrachten. Ich denke, Enten-Typisierung und Schnittstellen sind häufig anzutreffende Merkmale der Typsysteme von Programmiersprachen, beide haben ziemlich ähnliche Verhaltensweisen und beide sind für Programmierer wichtig, um sie zu verstehen.
quelle
Es fühlt sich fast selbstverständlich an zu sagen "Ja, wenn Foo das Tippen von Enten hat, hat Foo Polymorphismus". Aber ich kann nicht sagen , dass diese zu 100% sicher in einem gewissen Sinne, dass es vielleicht ist möglich , mit einem künstlichen Beispiele für ein solches System zu kommen , die Ente eingeben muss ( "kann es quaken && es auf dem Wasser schwimmen kann ==> es ist ein Ente ") ohne Polymorphismus (" foo, quack! "Scheitert), aber sie wären wirklich künstlich und in einer realen Welt würde ich sagen" Ja, wenn Ententypen vorhanden sind, muss auch Polymorphismus vorhanden sein ".
Persönlich sehe ich die Eingabe von Enten als "Polymorphismus richtig gemacht". Was ich damit meine, Dinge, die es in einer Enten-Typisierungswelt gibt, müssen keine expliziten Typen haben und ihr (polymorphes = "gleicher Zugriff, unterschiedliches Ergebnis") Verhalten ist das einzige, was zählt. In anderen Implementierungen des Polymorphismus ist er auf Typen / Schnittstellen / Vererbung beschränkt, daher ist er "implementierter und eingeschränkter Polymorphismus" und kein "Polymorphismus an sich".
quelle
(B. Pierce & Freunde)
Wie Sie in diesem Zusammenhang feststellen können, ist Entenschreiben ein dynamisches Schreiben, das anders als diese ausgeführt wird.
Es gibt einige Methoden, um den Typ zu bestimmen, der sich auf das Polymorphing bezieht, z. B. um den Code flexibler zu machen, aber das Eingeben von Enten ist in diesen Fällen ein anderes Problem.
Im Einzelnen gibt es typisierte Lambda-Berechnungen und untypisierte Lambda-Berechnungen, mit deren Hilfe die Berechnungseigenschaft und eine Berechnung bestimmt werden können.
Ich sehe auch, dass Dinge wie das Tippen von Enten helfen können, wenn wir nur ein schnelles Ergebnis erzielen möchten, aber bei anderen Gelegenheiten habe ich auch das Gefühl, dass die Dynamik es an die Bedürfnisse anpassbarer macht, sodass ich schneller rechnen kann. Ich denke, das ist nur zu sagen, Liebling, wenn ich wirklich weiß, was ich bereits berechnen möchte, ist es am besten, etwas zu tippen, aber warum weiß ich, was ich will? Hehehe ...
Das sind meine fünf Cent und ich denke, das kann ein interessantes Forschungsthema sein.
quelle