Wer hat sich für die Terminologie Downcasting und Upcasting entschieden?

8

Soweit ich weiß, basiert die Terminologie darauf, wie die Vererbungshierarchie traditionell angezeigt wird, wobei die erweiterten Typen unten und die übergeordneten Typen oben angezeigt werden.

Dies ist ein bisschen sinnlos, es sei denn, Sie möchten die folgenden Links- und Rechtssendungen aufrufen .

horizontale Vererbungshierarchie

Ich suche keine Meinungen, warum die Terminologie so ist wie sie ist, aber sie sind als Kommentare mehr als willkommen. Ich suche nach Referenzen darüber, wer zuerst Up- und Downcasting eingeführt hat und warum sie sich für diesen Namen entschieden haben .

Steven Jeuris
quelle
1
Obwohl sie etwas selbsterklärend sind, habe ich noch niemanden gehört, der diese Begriffe tatsächlich verwendet . Habt ihr eine Referenz? IOW: "Sie werden auf ein Objekt übertragen, das weniger kann, und Sie werden auf ein Objekt übertragen, das mehr kann." [Zitat benötigt]
Aufgabe
1
Ich halte Upcasting für sicherer (Sie gehen zu einem Typ, der garantiert mindestens eine Teilmenge der Mitglieder des Starttyps hat), während Sie beim Downcasting nicht wirklich sicher sein können, was Sie finden werden. Sicherer -> besser, damit die typische Argumentation funktioniert, die Sie verwenden. [/ Meinung]
Yannis
2
Und noch wichtiger. Haben Sie den Artikel gelesen, von dem Sie das Bild von Hund / Katze erhalten haben? Wenn nicht, unterstützt es meinen vorherigen Kommentar: Upcasting ist sicherer, da es niemals scheitern kann, Downcasting dagegen. Außerdem möchte ich hinzufügen, dass Upcasting uns auf eine höhere Abstraktionsebene bringt (wenn dies das Erinnern erleichtert).
Yannis
1
Es ist nicht so einfach, nach ihren Ursprüngen zu suchen, da Upcasting und Downcasting ältere Bedeutungen haben. Aber vielleicht haben diese Bedeutungen die OOP-Wörter beeinflusst. Aber das Ngram zeigt große Zuwächse um 1980 und 1995. Die frühesten bestimmten Hinweise auf Niedergeschlagenheit, die ich gefunden habe, stammen aus dem Jahr 1992 in der C ++ - Literatur ...
Hugo

Antworten:

3

Grundsätzlich ist das down-und up-castdie logische Fortsetzung des subtype( subclassin OOP) bzw. supertype( superclass), z. B. der klassischen Darstellung des abgeleiteten Typs, der sich unterhalb des ursprünglichen subTyptyps befindet.

Wenn wir nach dem Begriff subtypingsuchen, finden wir Folgendes ( Wikipedia ):

Der Begriff der Untertypisierung in Programmiersprachen stammt aus den 1960er Jahren; Es wurde in Simula-Derivaten eingeführt. Die ersten formalen Behandlungen der Subtypisierung wurden 1980 von John C. Reynolds, der die Kategorietheorie zur Formalisierung impliziter Konvertierungen verwendete, und Luca Cardelli (1985) gegeben.

Wie viele andere Dinge entstand es aus etwas, das hier vage als "Simula-Derivate" (wahrscheinlich frühe OOP-Sprachen) bezeichnet wird. Simula hat jedoch bereits den Begriff der Unterklasse , verfügt jedoch nicht über alle Eigenschaften von OOP.

Alexander Galkin
quelle
Wie in meiner Frage angegeben: "Die Terminologie ergibt sich aus der traditionellen Darstellung der Vererbungshierarchie . " Dies erklärt nicht den Grund, warum "sub" und "super" als "up" und "down" angezeigt werden sollten. Ich habe SIMULA bereits als Kommentar hinzugefügt.
Steven Jeuris
1
Hmm ... Sie sehen also keine Verbindung zwischen "sub" und "down"? Was ist mit Untertiteln, Subzero, unterschwelligen und anderen gebräuchlichen englischen Wörtern?
Alexander Galkin
1
Ps: In SIMULA wurde das Konzept der Vererbung ursprünglich "Verkettung" und später "Präfix" genannt . Ich kann mich nicht erinnern, beim Lesen der SIMULA-Dokumentation über Subtyping oder Supertyping gelesen zu haben. Ich glaube, das ist ein Begriff, der erst später auftauchte.
Steven Jeuris
Ich habe gerade die SIMULA-Dokumentation noch einmal gelesen . Unterklasse wird zwar verwendet, aber kein Subtyp. Durch erneutes Lesen Ihrer Antwort weiß ich jetzt, was Sie gemeint haben. :) Würde immer noch eine tatsächliche Referenz bevorzugen, aber ich sehe, wie Sie von "sub" nach niedriger gehen.
Steven Jeuris
3
@StevenJeuris: Es ist eigentlich nicht so eindeutig; Eine Unterklasse hat normalerweise mehr Funktionen als die übergeordnete Klasse. In einer anderen Welt verwenden wir möglicherweise den Begriff "Heraufstufen" oder "Herabstufen" für "Herabstufen" bzw. "Heraufstufen", wenn wir der Meinung sind, dass ein Supertyp der Unterklasse untergeordnet ist, weil eine Unterklasse leistungsfähiger ist / mehr Funktionen aufweist als die Oberklasse. IMO der wahre Grund, warum diese Begriffe verwendet werden, sind meist historische Unfälle.
Lie Ryan
3

Die älteste Referenz, die ich bisher gefunden habe, stammt aus dem September 1990 in einem Usenet-Beitrag .

Die Bibliothek, auf die dort verwiesen wird, ist die NIHCL ( erhältlich von der Software Preservation Group ), die diesen Code enthält ( MIist "Mehrfachvererbung"):

#ifdef MI

#define DECLARE_CASTDOWN(classname) \
    static classname& castdown(Object& p) \
        { return *(classname*)(&p ? p._safe_castdown(*desc()) : 0); } \
    static const classname& castdown(const Object& p) \
        { return *(const classname*)(&p ? p._safe_castdown(*desc()) : 0); } \
    static classname* castdown(Object* p) \
        { return (classname*)(p ? p->_safe_castdown(*desc()) : 0); } \
    static const classname* castdown(const Object* p) \
        { return (const classname*)(p ? p->_safe_castdown(*desc()) : 0); } \

#else

#define DECLARE_CASTDOWN(classname) \
    static classname& castdown(Object& p)           { return (classname&)p; } \
    static const classname& castdown(const Object& p)   { return (const classname&)p; } \
    static classname* castdown(Object* p)           { return (classname*)p; } \
    static const classname* castdown(const Object* p)   { return (const classname*)p; } \

#endif

In dem Buch, in dem dieser Code enthalten war ( Datenabstraktion und objektorientierte Programmierung in C ++ ), wird auch der Begriff "Castdown" verwendet.

Der Begriff "Castdown" scheint auch vor "Downcast" zu stehen , zumindest im Usenet.

porges
quelle