Wie unterscheidet sich die Vererbung von der Untertypisierung?

15

Was ist in der Programmiersprachenperspektive mit Subtypisierung gemeint? Ich habe gehört, dass "Vererbung keine Untertypisierung" ist. Was sind dann die Unterschiede zwischen Vererbung und Subtypisierung?

RoboAlex
quelle
6
Ich frage mich, ob diese Frage (und andere, die sie mögen) möglicherweise auf die neue cs.SE-Site umgeleitet wird, wenn sie in die öffentliche Beta übergeht.
Suresh Venkat
1
Willkommen bei cstheory, einer Q & A-Site für Fragen auf Forschungsebene in der theoretischen Informatik (TCS). Ihre Frage scheint keine Frage auf Forschungsebene in TCS zu sein. Bitte beachten Sie die FAQ für mehr Informationen darüber , was durch diese und Vorschläge für Websites , gemeint ist , dass Ihre Frage begrüßen könnte. Wenn Ihre Frage aufgrund von Unzulässigkeiten geschlossen ist und Sie der Meinung sind, dass Sie sie bearbeiten können, um sie zu einer Frage auf Forschungsebene zu machen, können Sie dies gerne tun. Closing ist nicht dauerhaft und Fragen können wieder geöffnet werden, überprüfen Sie die FAQ für weitere Informationen.
Kaveh
3
@UdayReddy: Keine Frage war bei der ersten Beantwortung nicht trivial, aber wir sollten aus heutiger Sicht eine Entscheidung treffen. Dasselbe Argument wie das Ihre würde implizieren, dass die Frage nach dem Dijkstra-Algorithmus ein aktuelles Thema ist, da der erste Artikel darüber und über nichts anderes spricht.
Tsuyoshi Ito
3
@TsuyoshiIto Die Analogie ist nicht angebracht , weil Dijkstra erstes Papier gelöst , das Problem während Cardelli ersten Papiers hier erstellt das Problem. Ich gehe jedoch davon aus, dass wir den Stand der Technik nicht anhand des ersten Papiers messen. Lassen Sie mich versichern, dass die Unterschiede zwischen Vererbung und Untertypisierung kein gelöstes Problem darstellen, und ich gehe davon aus, dass das Problem noch mindestens 20 Jahre diskutiert wird. Dem Fragesteller wird möglicherweise empfohlen, zusätzliche Hausaufgaben zu machen und die Frage zu bearbeiten, um die Probleme auf Forschungsebene zu klären.
Uday Reddy
3
In jedem Fall ist es einfach genug, das OP auf Cook et al. Mit dem gleichen Namen zu verweisen
Andreas Rossberg

Antworten:

18

[Ich habe mich nicht eingehend mit den Problemen objektorientierter Typensysteme befasst, aber ich werde sagen, was ich weiß, um die Diskussion in Gang zu bringen.]

EINBEINBEINB

EINB

Die strukturelle Untertypisierung stellt keine verhaltensbezogene Untertypisierung sicher, da die Struktur eines Typs möglicherweise aus versehentlichen Gründen übereinstimmt. Die Definition des erwarteten Verhaltens ist jedoch nicht einfach. Daher verwenden viele Programmiersprachen einen Zwischenpunkt, an dem der Benutzer deklarieren muss, welcher Typ ein Subtyp von welchem ​​ist. Dies wird als "nominelle Untertypisierung" bezeichnet . Siehe die Frage zu impliziter vs expliziter Untertypisierungfür eine Diskussion zu diesem Thema. Die Idee ist, dass der Programmierer die Verhaltensuntertypen für alle deklarierten Untertypen mit seinem eigenen Einfallsreichtum sicherstellen muss. Die Sprache kann keine Hilfe anbieten. Alle deklarierten Subtypen müssen jedoch mindestens strukturelle Subtypen sein. Andernfalls kann das Programm check nicht eingeben. Die Sprache kann dabei helfen. (Einige Programmiersprachen verfügen nicht über genügend Typsysteme, um dies zur Kompilierungszeit sicherzustellen. In diesem Fall würde der Typfehler zur Laufzeit erkannt, oder es könnten falsche Ergebnisse erzeugt werden. Solche Typlöcher sind offensichtlich unerwünscht.)

Wenn man in objektorientierten Programmen Unterklassen definiert, fügt man normalerweise öffentlich sichtbare Felder (oder Methoden) hinzu. In den meisten Programmiersprachen werden solche Unterklassen als nominelle Untertypen betrachtet. Die Frage ist, ob es sich auch um strukturelle Untertypen handelt. Wenn dies nicht der Fall ist, dh die Programmiersprache erlaubt es, nominelle Subtypen zu deklarieren, die keine strukturellen Subtypen sind, dann gibt es in der Programmiersprache Typlöcher.

In einfachen Fällen funktioniert das Hinzufügen von Feldern problemlos. Der Typ der Oberklasse erwartet weniger Felder als der Typ der Unterklasse. Wenn Sie also eine Instanz einer Unterklasse einfügen, in der eine Instanz der sueprclass erwartet wird, ignoriert das Programm nur die bereitgestellten zusätzlichen Felder, und es tritt kein Fehler auf.

Wenn jedoch die Ober- oder Unterklasse über Methoden verfügt, die Argumente desselben Typs annehmen oder Ergebnisse desselben Typs zurückgeben, treten Probleme auf. Dann ist der Schnittstellentyp der Unterklasse kein struktureller Untertyp des der Oberklasse. Weit verbreitete typsichere Programmiersprachen wie Java lassen solche Unterklassen nicht zu. Sie schränken die Sprache ein, um die Typensicherheit zu gewährleisten. Die Programmiersprache Eiffel soll die Typensicherheit geopfert haben, um stattdessen Flexibilität zu erhalten . Wenn man ein starkes Typensystem entwirft, das Flexibilität bewahrt, muss man das Prinzip aufgeben, dass Subklassen Subtypen hervorrufen. Daher der Titel der Arbeit "Inheritance is not subtyping". Die Autoren schlagen einen anderen Begriff der Subtypisierung höherer Ordnung vor, der stattdessen funktioniert. Kim Bruce hat auch einen eng verwandten Vorschlag namens "Matching", der den gleichen Effekt erzielt. Siehe diese Präsentation . Hilfreich ist auch ein Positionspapier von Andrew Black.

Die Semantik-Community ist wahrscheinlich schuld daran, das Problem weitgehend zu ignorieren. Wir haben es traditionell als ein praktisches Problem der Systemtechnik angesehen, das theoretisch von geringem Interesse ist. Wenn dies nicht der Fall ist und es tatsächlich einige semantische Arbeiten in diesem Bereich gibt, hoffe ich, dass die anderen Leute sie erwähnen werden.

Uday Reddy
quelle
1
Es ist vielleicht auch erwähnenswert, dass es aktuelle Sprachen gibt, die die Untertypisierung erfolgreich von der Vererbung abgekoppelt haben, z. B. Ocaml in seinem Objektsystem.
Andreas Rossberg
@AndreasRossberg Tatsächlich war OCaml nicht in meinem Rahmen, als ich diese Antwort schrieb. Ich nehme an, OCaml hat überhaupt keine nominelle Untertypisierung. Einige dieser Probleme würden also nicht auftreten. Es besteht jedoch die Möglichkeit, dass Typen versehentlich übereinstimmen, auch wenn dies nicht der Fall ist, und das Typensystem kann solche Fehler nicht erkennen.
Uday Reddy