Ao discutir uma pergunta sobre funções virtuais no Stack Overflow, perguntei-me se havia alguma nomeação oficial para funções virtuais puras (abstratas) e não puras.
Eu sempre confiei na wikipedia para minhas informações, que afirmam que funções virtuais puras e não puras são o termo geral. Infelizmente, o artigo não faz backup com uma origem ou referências.
Para citar a resposta de Jon Skeet à minha resposta de que puro e não puro é o termo geral usado:
@ Steven: Hmm ... possivelmente, mas eu só vi isso no contexto de C ++ antes. Eu suspeito que alguém falando sobre eles provavelmente tenha um background em C ++ :)
Os termos se originaram em C ++, ou foram definidos ou implementados pela primeira vez em um idioma anterior, e são os termos científicos "oficiais"?
ATUALIZAR:
Frank Shearar forneceu um link para a descrição do SIMULA 67 Common Base Language (1970). Esse idioma parece ser o primeiro idioma a introduzir palavras-chave OO como classe , objeto e também virtual como conceito formal. Ele não definir pura / não-puro ou abstrata , mas ele suporta os conceitos .
Quem os definiu?
fonte
Respostas:
Nygaard e Dahl usaram o termo pela primeira vez, no SIMULA 67 Common Base Language . Veja a seção 2.1, por exemplo, e a seção 2.2.3. (Pelo que sei, pelo menos. Mas, ei, no que diz respeito à OOP, provavelmente é o primeiro uso do termo.)
fonte
Então ... eu tenho feito uma pequena pesquisa. O que se segue é uma pequena lição de história para os interessados. :) Pule para a conclusão na parte inferior, se você estiver interessado apenas na resposta.
1967 :
O SIMULA 67 , a primeira linguagem de programação orientada a objetos, define as palavras-chave como classe , objeto , chamada por referência , chamada por valor e virtual .
O sistema de herança do SIMULA era originalmente conhecido por um nome diferente, concatenação (e mais tarde conhecido como prefixo ), referindo-se ao fato de que o código dos supertipos foi copiado e 'concatenado' com o código dos subtipos. Mais tarde , surgiu outra forma de sistema de herança , a delegação , onde as chamadas são delegadas por referência ao tipo correto.
O virtual provavelmente se refere ao processo que precisa ser executado para despachar uma chamada para a implementação correta usando uma tabela de método virtual . É virtual em comparação com uma implementação fixa / concreta.
1971 :
Niklaus Wirth, escreve sobre um conceito definido como Stepwise Refinement . Ele explica basicamente como dividir um programa em soluções parciais nas quais pode ser estendido.
1974 :
Este é o primeiro artigo que encontrei que inventa o termo tipos de dados abstratos de Barbara Liskov .
Este artigo também define um cluster de operações que parece especificar o que sabemos agora como interface .
Terminologia científica interessante (artigo de 1996):
Herança : um mecanismo de nível mais baixo pelo qual objetos ou classes podem compartilhar comportamento ou dados.
Subtipagem : expressa especialização conceitual. Uma forma específica de herança, também chamada herança de interface .
Princípios de abstração : O processo de organizar nosso conhecimento de um domínio de aplicativo em classificações hierárquicas de ordenações de abstrações, a fim de obter uma melhor compreensão dos fenômenos em questão.
Abstrações parcialmente implementadas : abstrações cujas definições foram propositadamente deixadas incompletas.
Classes abstratas : Termo específico para uma classe parcialmente implementada em sistemas orientados a objetos.
Herança não restrita : permite que as operações sejam redefinidas (ou mesmo removidas) nas subclasses.
Herança estrita : herança comportamentalmente compatível.
Conclusão :
Classe abstrata é o termo mais geral a ser usado em sistemas orientados a objetos. Parece que as funções virtuais puras e não puras são originárias apenas do C ++. Por exemplo, esta entrevista com Stroustrup parece que ele inventou os termos. Trabalhos científicos usam terminologia mais geral.
O Virtual é originário do SIMULA, o que faz com que seu uso seja generalizado, mas não é um termo geral. Ele já define os detalhes da implementação. Falar em termos de tipos de herança é mais apropriado. Por padrão, não virtual corresponde a herança estrita por padrão, enquanto virtual por padrão corresponde a herança não restrita .
Alguém interessado em ajustar a entrada da Wikipedia ? :)
fonte
No C ++, funções-membro dinamicamente ligadas e, portanto, podem ser substituídas por uma subclasse são chamadas de "virtuais". Funções virtuais que absolutamente devem ser substituídas são chamadas de "virtual puro". Observe que uma função virtual pura pode ter um corpo, embora muitas vezes não tenha. Uma classe que possui pelo menos uma função virtual pura é chamada "abstrata" e não pode ser instanciada, derivada apenas de.
Eu estou supondo que a razão pela qual as funções virtuais são chamadas de virtual é o fato de que não se sabe qual função real será chamada em tempo de compilação. Em certo sentido, uma chamada de função virtual "não existe" em tempo de compilação.
Também estou supondo que a razão pela qual o termo "abstrato" seja usado para uma classe com uma função virtual pura seja porque você não pode ter nenhum objeto dessa classe. Em certo sentido, é um conceito abstrato muito distante do mundo concreto dos objetos.
Editar: outros idiomas.
Quanto à questão de quão geral é o termo "virtual", aqui estão meus dois centavos. No Smalltalk, todas as funções usam ligação dinâmica; portanto, todas são virtuais e não é necessário um termo especial ou uma palavra-chave no idioma. Em Java, se não me engano, o compilador decide automaticamente se a ligação dinâmica deve ser usada; portanto, no que diz respeito ao programador, não há distinção e, portanto, nenhuma palavra-chave "virtual".
No C ++, a distinção entre virtual e não virtual é necessária, porque cabe ao programador decidir quando a ligação dinâmica deve ser usada para economizar na sobrecarga quando não é necessária.
fonte
dynamic
- que é um tipo de método virtual que troca espaço por tempo: eles ocupam menos espaço e são mais lentos de executar do que osvirtual
métodos.