Gibt Ente eine Teilmenge des Polymorphismus ein?


17

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?

1
Nicht sicher, wonach Sie in einer Antwort suchen. Sie haben beide genau definiert, sodass Sie so viele endgültige Antworten haben, wie es gibt. Zu entscheiden, ob das Tippen von Enten als Polymorphismus "zählt", ist mehr oder weniger eine philosophische Frage, oder vielleicht eine Terminologiefrage, wenn Sie es so meinen. Also, wonach würden Sie in einer Antwort suchen?
PSR

@psr Ich habe im Grunde gesagt: "So interpretiere ich es. Irre ich mich? Habe ich Recht? Gibt es repubable Akademiker, die es auf die eine oder andere Weise sagen. Gibt es Artikel zu diesem Thema?" Im Grunde genommen ist eine andere als "Ententypisierung eine Implementierung / Teilmenge des Polymorphismus". Was kann man noch über die Beziehung sagen?
Raynos

Soweit ich weiß, macht Homographie das Tippen von etwas anderem als einer einheitlichen Oberfläche unmöglich => kein Polymorphismus oder zumindest nicht in einem Sinne, wie Wikipedia es definiert. Eg door.close()andtiger.close()
gnat

4
Duck Typing ist ein Fall von Ad-hoc-Polymorphismus . Du überdenkst das.
Yannis

Antworten:


16

Ich sage, dass Polymorphismus ein generisches Merkmal ist, das auf verschiedene Arten implementiert werden kann:

  • klassenbasierte Vererbung.
  • prototypbasierte Objekte (mit oder ohne Vererbung)
  • Ente tippen
  • Interface-Konformität (wie von Go's Interfaces und implizit in C ++ - Templates)

Jeder von ihnen ermöglicht es dem Programmierer, einen einzigen Code mit unterschiedlichen Typen zu verwenden, sodass alle das Konzept des Polymorphismus verkörpern.


7

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.


2
Das ist falsch. Polymorphismus ist ein riesiger Regenschirm, der viele Dinge abdeckt. Insbesondere wird das Tippen von Enten behandelt. Daher ist das Typisieren von Enten eine Form des Polymorphismus.
Thomas Eding

Ich stimme dir nicht zu. Die traditionelle Vererbung mit Verhaltensmethoden weist dieselben Merkmale auf. Es ist nur typsicherer, indem explizit angegeben wird, welches Verhalten ein Objekt garantiert aufweist (was andere Verhaltensweisen nicht ausschließt!)
marstato

6

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 .


Das Problem mit dem Wikipedia-Artikel und wie viele Leute den Begriff heutzutage verwenden, ist, dass er nicht definiert, was das Tippen von Enten bedeutete, als ich ihn das erste Mal sah (nämlich eine Form des Tippens), sondern vielmehr, dass man einfach Methoden aufrufen und a werfen kann Laufzeitfehler, wenn sie nicht definiert sind. Das ist nicht Tippen, sondern das Fehlen von Tippen, wie Eric Lippert erklärt .
Reinierpost

1

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.


6
"polymorphismus erfordert explizites wissen" wo steht das? klassenbasierte Vererbung ist nur eine Form des Polymorphismus, nicht die einzige.
Javier

Und wie wäre es mit Ad-hoc-Polymorphismus ?
Yannis

@YannisRizos - Das Problem bei der Beantwortung von Fragen wie diesen ist, dass es so viele Sprachen und so viele Begriffe gibt, dass jemand Sie nitpicken könnte, egal was Sie sagen. Ich verstehe, warum "Ad-hoc-Polymorphismus" das Wort "Polymorphismus" im Namen hat, aber ich würde behaupten, es ist etwas anderes als das, was das OP mit "Polymorphismus" bedeutet.
PSR

@ Javier - Alle Methoden, die Sie aufgelistet haben, erfordern eine explizite Aussage, mit Ausnahme des Tippens von Enten.
PSR

@psr Eigentlich ist mir egal, was OP mit "Polymorphismus" gemeint hat. Ich denke nicht, dass es irgendjemand interessieren sollte, es ist ein wissenschaftliches Konzept mit einer sehr einfachen Definition, ich denke nicht, dass wir basierend auf unseren eigenen Interpretationen antworten sollten oder was wir vielleicht denken, es ist die Interpretation des OP. Insbesondere die Interpretation des OP, da er dies standardmäßig verlangt, ist er sich seiner Interpretation nicht sicher. Ich bin nicht der Meinung, dass es sich um eine philosophische Frage handelt. Die Frage war eine wissenschaftliche Frage mit einer einfachen Antwort: Ja, Ententypisierung ist eine Form des Ad-hoc-Polymorphismus, eine Teilmenge des Polymorphismus.
Yannis

1

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".


0

Statisch typisierte Programmiersprachen ermöglichen eine frühere Fehlerprüfung, eine bessere Durchsetzung disziplinierter Programmierstile und die Generierung von effizienterem Objektcode als Sprachen, bei denen alle Typkonsistenzprüfungen zur Laufzeit durchgeführt werden.

(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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.