Quem decidiu a terminologia downcasting e upcasting?

8

Até onde eu sei, a terminologia vem de como a hierarquia de herança é tradicionalmente exibida, com os tipos de extensão na parte inferior e os tipos de pai na parte superior.

Isso é um pouco inútil, a menos que você queira ligar para a esquerda e a direita .

hierarquia de herança horizontal

Não estou procurando opiniões por que a terminologia é como é, mas elas são mais que bem-vindas como comentários. Eu estou procurando referências sobre quem apresentou e baixou pela primeira vez e por que eles escolheram esse nome .

Steven Jeuris
fonte
1
Embora sejam um pouco auto-explicativos, nunca ouvi alguém usar esses termos. Você tem uma referência? IOW: "Você faz upcast para um objeto que pode fazer menos e você faz downcast para um objeto que pode fazer mais." [citação necessário]
Tarefa
1
Considero o upcasting mais seguro (você vai para um tipo que garante pelo menos um subconjunto dos membros do tipo inicial), enquanto que o downcasting não pode ter certeza do que encontrará. Mais seguro -> melhor, para que o raciocínio típico que você usa funcione. [/ parecer]
yannis
2
E muito mais importante. Você leu o artigo de onde obteve a imagem do cão / gato? Caso contrário, ele suporta meu comentário anterior: upcasting é mais seguro, como nunca pode falhar, downcasting, por outro lado, pode. Além disso, eu acrescentaria que o upcasting nos leva a um nível de abstração mais alto (se isso facilitar a sua lembrança).
yannis
1
Não é tão fácil procurar suas origens, porque upcasting e downcasting têm significados mais antigos. Mas talvez esses significados tenham influenciado as palavras OOP. Mas o Ngram mostra grandes aumentos por volta de 1980 e 1995. As primeiras referências a downcast [ing] que encontrei são de 1992 na literatura C ++ ...
Hugo

Respostas:

3

Basicamente, o down-e up-casté a continuação lógica do subtype( subclassem OOP) e supertype( superclassrespectivamente), por exemplo, a representação clássica do tipo derivado a ser localizado abaixo do tipo- subtipo original.

Se procurarmos pelo termo subtyping, encontraremos o seguinte ( Wikipedia ):

A noção de subtipagem em linguagens de programação remonta à década de 1960; foi introduzido nos derivados de Simula. Os primeiros tratamentos formais de subtipagem foram dados por John C. Reynolds, em 1980, que usou a teoria das categorias para formalizar conversões implícitas, e Luca Cardelli (1985).

Então, como muitas outras coisas, ele se originou em algo vagamente chamado aqui como "derivados do Simula" (provavelmente as primeiras linguagens OOP). Simula, no entanto, já possui a noção de subclasse , mas não apresenta todas as propriedades do OOP.

Alexander Galkin
fonte
Como afirmado na minha pergunta: "a terminologia vem de como a hierarquia de herança é tradicionalmente exibida" . Isso não explica o motivo pelo qual "sub" e "super" devem ser exibidos como "up" e "down". Eu já adicionei o SIMULA como um comentário.
Steven Jeuris
1
Hmm ... Então, você não vê conexão entre "sub" e "down"? E as legendas, subzero, subliminar e outras palavras comuns em inglês?
Alexander Galkin
1
Ps: No SIMULA, o conceito de herança era originalmente chamado de "concatenação" e, posteriormente, "prefixo" . Não me lembro de ler sobre subtipagem ou supertipagem ao ler a documentação do SIMULA. Eu acredito que este é um termo que só surgiu mais tarde.
precisa
Acabei de reler a documentação do SIMULA . A subclasse é realmente usada, mas não o subtipo. Ao reler sua resposta, agora sei o que você quis dizer. :) Ainda preferiria uma referência real, mas vejo como você passa de "sub" para baixo.
Steven Jeuris
3
@ StevenJeuris: na verdade não é tão claro; uma subclasse normalmente possui mais recursos do que a classe pai; em um mundo alternativo, podemos estar usando o termo "promover" ou "rebaixar" para "downcasting" e "upcasting" respectivamente, se pensarmos que um supertipo é um subordinado da subclasse porque uma subclasse é mais poderosa / possui mais recursos do que a superclasse. Na OMI, a verdadeira razão pela qual esses termos são usados ​​são principalmente acidentes históricos.
Lie Ryan
3

A referência mais antiga que encontrei ainda é de setembro de 1990, em um post da Usenet .

A biblioteca referenciada é o NIHCL ( disponível no Software Preservation Group ), que contém este código ( MIé "herança múltipla"):

#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

O livro em que esse código foi incluído ( Abstração de Dados e Programação Orientada a Objetos em C ++ ) também usa o termo "castdown".

O termo "castdown" também parece anteceder "downcast" , pelo menos na Usenet.

porges
fonte