¿Quién decidió sobre la terminología downcasting y upcasting?

8

Hasta donde sé, la terminología proviene de cómo se muestra tradicionalmente la jerarquía de herencia , con los tipos extendidos en la parte inferior y los tipos primarios en la parte superior.

Esto es un poco inútil, a menos que tenga ganas de llamar a la siguiente emisión a la izquierda y derecha .

jerarquía de herencia horizontal

No estoy buscando opiniones por qué la terminología es como es, pero son más que bienvenidos como comentarios. Estoy buscando referencias sobre quién introdujo por primera vez el downcasting y por qué decidieron ese nombre .

Steven Jeuris
fuente
1
Aunque de alguna manera se explican por sí mismos, no he escuchado a nadie usar estos términos. ¿Tienes una referencia? IOW: "Se eleva a un objeto que puede hacer menos, y se baja a un objeto que puede hacer más". [cita requerida]
Tarea
1
Considero que la transmisión es más segura (vas hacia un tipo que tiene garantizado tener al menos un subconjunto de los miembros del tipo inicial), mientras que cuando estás bajando no puedes estar realmente seguro de lo que encontrarás. Más seguro -> mejor, por lo que el razonamiento típico que utiliza funciona. [/ opinion]
yannis
2
Y bastante más importante. ¿ Leíste el artículo de donde obtuviste la imagen del perro / gato? De lo contrario, es compatible con mi comentario anterior: la transmisión es más segura, ya que nunca puede fallar, pero la descarga puede. También agregaría que la transmisión nos lleva a un nivel de abstracción más alto (si eso hace que sea más fácil para usted recordarlo).
yannis
1
No es tan fácil de buscar sus orígenes porque upcasting y downcasting tienen significados mayores. Pero quizás esos significados influyeron en las palabras OOP. Pero los Ngram muestra grandes aumentos de alrededor de 1980 y 1995. Las primeras referencias a ciertos abatido [ing] he encontrado son de 1992 en la literatura C ++ ...
Hugo

Respuestas:

3

Básicamente, down-y up-castes la continuación lógica de subtype( subclassen OOP) y supertype( superclassrespectivamente), por ejemplo, la representación clásica del tipo derivado que se encuentra debajo del tipo original - subtipo.

Si buscamos el término subtypingencontramos lo siguiente ( Wikipedia ):

La noción de subtipo en lenguajes de programación se remonta a la década de 1960; se introdujo en derivados de Simula. Los primeros tratamientos formales del subtipo los dieron John C. Reynolds en 1980, que utilizó la teoría de categorías para formalizar las conversiones implícitas, y Luca Cardelli (1985).

Entonces, como muchas otras cosas, se originó en algo vagamente llamado aquí como "derivados de Simula" (probablemente los primeros lenguajes OOP). Simula, sin embargo, ya tiene la noción de subclase , pero no presenta todas las propiedades de OOP.

Alexander Galkin
fuente
Como se indica en mi pregunta: "la terminología proviene de cómo se muestra tradicionalmente la jerarquía de herencia" . Esto no explica la razón por la cual "sub" y "super" deberían mostrarse como "arriba" y "abajo". Ya agregué SIMULA como comentario.
Steven Jeuris
1
Hmm ... Entonces, ¿no ves la conexión entre "sub" y "abajo"? ¿Qué pasa con los subtítulos, bajo cero, subliminal y otras palabras comunes en inglés?
Alexander Galkin
1
Ps: En SIMULA, el concepto de herencia se llamaba originalmente "concatenación" y luego "prefijo" . No recuerdo haber leído sobre subtipos o supertipados al leer la documentación de SIMULA. Creo que este es un término que solo surgió más tarde.
Steven Jeuris
Acabo de releer la documentación de SIMULA . De hecho, se usa la subclase, pero no el subtipo. Al releer su respuesta ahora sé lo que quiso decir. :) Todavía preferiría una referencia real, pero veo cómo se pasa de "sub" a inferior.
Steven Jeuris
3
@ StevenJeuris: en realidad no es tan claro; una subclase generalmente tiene más características que la clase padre; en un mundo alternativo, podemos estar usando el término "promover" o "degradar" para "derribar" y "subir" respectivamente, si pensamos que un supertipo es un subordinado de la subclase porque una subclase es más poderosa / tiene más características que la superclase En mi opinión, la verdadera razón por la que se utilizan estos términos son en su mayoría accidentes históricos.
Lie Ryan
3

La referencia más antigua que he encontrado hasta ahora es de septiembre de 1990, en una publicación de Usenet .

La biblioteca a la que se hace referencia allí es el NIHCL ( disponible del Grupo de preservación de software ), que contiene este código ( MIes "herencia múltiple"):

#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

El libro con el que se incluyó este código ( abstracción de datos y programación orientada a objetos en C ++ ) también usa el término "rechazo".

El término "castdown" también parece ser anterior a "downcast" , al menos en Usenet.

porges
fuente