Puro virtual o abstracto, ¿qué hay en un nombre?

14

Mientras discutía una pregunta acerca de las funciones virtuales sobre el desbordamiento de pila, me pregunté si había algún nombre oficial para puros (resumen ) y funciones virtuales no puras.

Siempre confié en wikipedia para mi información, que indica que las funciones pura y no pura virtual son el término general . Desafortunadamente, el artículo no lo respalda con un origen o referencias.

Para citar la respuesta de Jon Skeet a mi respuesta de que puro y no puro es el término general utilizado:

  

@Steven: Hmm ... posiblemente, pero solo lo he visto antes en el contexto de C ++. Sospecho que es probable que alguien que hable sobre ellos tenga antecedentes en C ++ :)

¿Se originaron los términos de C ++, o se definieron o implementaron por primera vez en un idioma anterior, y son los términos científicos "oficiales"?

ACTUALIZACIÓN:

Frank Shearar proporcionó amablemente un enlace a la descripción de SIMULA 67 Idioma base común (1970). Este lenguaje parece ser el primer idioma en introducir palabras clave OO como class , object , y también virtual como un concepto formal. no define puro / no puro o abstracto , pero admite los conceptos .

¿Quién los definió?

    
pregunta Steven Jeuris 09.02.2011 - 20:28

3 respuestas

7

Entonces ... he estado haciendo una pequeña investigación. Lo que sigue es una pequeña lección de historia para los interesados. :) Salte a la conclusión en la parte inferior si solo está interesado en la respuesta.

1967 :

SIMULA 67 , el primer lenguaje de programación orientado a objetos define las palabras clave como clase , < em> object , call by reference , call by value y virtual .

El sistema de herencia de SIMULA se conocía originalmente con un nombre diferente, concatenación (y más tarde conocido como prefijo ), refiriéndose al hecho de que el código de supertipos fue copiado y 'concatenado' con el código de subtipos. Más adelante, otra forma de sistema de herencia emergió, delegación , donde las llamadas se delegan por referencia al tipo correcto.

Virtual probablemente se refiere al proceso que debe realizarse para enviar una llamada a la implementación correcta mediante el uso de tabla de método virtual . Es virtual en comparación con una implementación fija / concreta.

1971 :

Niklaus Wirth, escribe sobre un concepto definido como Stepwise Refinement . Básicamente explica cómo dividir un programa en soluciones parciales en las que se puede ampliar.

1974 :

Este es el documento más antiguo que encontré y que acuña el término resumen tipos de datos por Barbara Liskov .

  

Un tipo de datos abstractos define una clase de objetos abstractos que se caracteriza completamente por las operaciones disponibles en esos objetos. Esto significa que se puede definir un tipo abstracto definiendo las operaciones de caracterización para ese tipo. Cuando un programador utiliza un objeto de datos abstractos, solo se preocupa por el comportamiento que muestra ese objeto, pero no por los detalles de cómo se logra ese comportamiento por medio de una implementación.

Este documento también define un grupo de operaciones que parece especificar lo que ahora conocemos como interfaz .

Interesante terminología científica (documento de 1996):

Herencia : un mecanismo de más bajo nivel mediante el cual los objetos o clases pueden compartir comportamiento o datos.

Subtipo : expresa la especialización conceptual. Una forma específica de herencia, también llamada herencia de interfaz .

Principios de abstracción : el proceso de organizar nuestro conocimiento de un dominio de aplicación en clasificaciones jerárquicas de ordenamientos de abstracciones, para obtener una mejor comprensión de los fenómenos en cuestión.

Abstracciones parcialmente implementadas : abstracciones cuyas definiciones quedaron deliberadamente incompletas.

Clases abstractas : término específico para una clase parcialmente implementada en sistemas orientados a objetos.

Herencia sin restricciones : permite que las operaciones se redefinan (o incluso se eliminen) en las subclases.

Herencia estricta : herencia compatible con el comportamiento.

Conclusión :

Clase abstracta es el término más general para usar en sistemas orientados a objetos. Parece que las funciones virtuales puras y no puras solo se originan en C ++. Por ejemplo, esta entrevista con Stroustrup hace que parezca que inventó los términos. Los trabajos científicos utilizan una terminología más general.

Virtual se origina en SIMULA, lo que hace que su uso sea generalizado, pero no es un término general. Ya define los detalles de implementación. Hablando en términos de tipos de herencia es más apropiado. No virtual por defecto corresponde a herencia estricta por defecto, mientras que virtual por defecto corresponde a herencia sin restricciones .

¿Alguien interesado en ajustar la entrada de wikipedia ? :)

    
respondido por el Steven Jeuris 15.02.2011 - 02:10
9

Nygaard y Dahl primero usaron el término, en SIMULA 67 Common Base Language . Mire en la sección 2.1, por ejemplo, y en la sección 2.2.3. (Hasta donde puedo decir, al menos. Pero bueno, en lo que respecta a OOP, es probablemente el primer uso del término).

    
respondido por el Frank Shearar 09.02.2011 - 21:56
4

En C ++, las funciones miembro que están vinculadas dinámicamente y, por lo tanto, pueden ser anuladas por una subclase se denominan "virtuales". Las funciones virtuales que absolutamente deben ser anuladas se llaman "virtual puro". Tenga en cuenta que una función virtual pura puede tener un cuerpo, aunque a menudo no la tiene. Una clase que tiene al menos una función virtual pura se llama "abstracta" y no se puede crear una instancia, solo se deriva de.

Supongo que la razón por la que las funciones virtuales se llaman virtuales es el hecho de que no se sabe a qué función real se llamará en el momento de la compilación. En cierto sentido, una llamada de función virtual "no existe" en el momento de la compilación.

También supongo que la razón por la que se usa el término "abstracto" para una clase con una función virtual pura es que no puede tener ningún objeto de esa clase. En cierto sentido, es un concepto abstracto muy alejado del mundo concreto de los objetos.

Editar: Otros idiomas.

En cuanto a la cuestión de cuán general es el término "virtual", aquí están mis dos centavos. En Smalltalk, todas las funciones utilizan enlaces dinámicos, de modo que todas son virtuales y no es necesario un término especial o una palabra clave de idioma. En Java, si no me equivoco, el compilador decide automáticamente si se debe usar el enlace dinámico, por lo que en lo que respecta al programador no hay distinción, y por lo tanto no hay una palabra clave "virtual".

En C ++, la distinción entre virtual y no virtual es necesaria, ya que el programador debe decidir cuándo se debe usar el enlace dinámico para ahorrar en la sobrecarga cuando no es necesario.

    
respondido por el Dima 09.02.2011 - 21:57

Lea otras preguntas en las etiquetas