Mientras discutía una pregunta sobre las funciones virtuales en Stack Overflow, me preguntaba si había algún nombre oficial para las funciones virtuales puras (abstractas) y no puras.
Siempre confié en wikipedia para obtener mi información, que establece que las funciones virtuales puras y no puras 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, el término general utilizado es puro y no puro:
@ Steven: Hmm ... posiblemente, pero solo lo he visto antes en el contexto de C ++. Sospecho que cualquiera que hable de ellos probablemente tenga antecedentes de C ++ :)
¿Los términos se originaron en C ++, o se definieron o implementaron por primera vez en un lenguaje anterior, y son los términos científicos 'oficiales'?
ACTUALIZAR:
Frank Shearar proporcionó un enlace útil a la descripción de SIMULA 67 Common Base Language (1970). Este lenguaje parece ser el primer idioma en introducir palabras clave OO como clase , objeto y también virtual como un concepto formal. Que no definen pura / no pura o abstracta , sino que es compatible con los conceptos .
¿Quién los definió?
fuente
Respuestas:
Nygaard y Dahl usaron el término por primera vez, en SIMULA 67 Common Base Language . Mire en la sección 2.1, por ejemplo, y la sección 2.2.3. (Hasta donde puedo decir al menos. Pero bueno, en lo que respecta a OOP, es probable que sea el primer uso del término).
fuente
Entonces ... he estado investigando un poco. 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 le interesa la respuesta.
1967 :
SIMULA 67 , el primer lenguaje de programación orientado a objetos define palabras clave como clase , objeto , llamada por referencia , llamada por valor y virtual .
El sistema de herencia de SIMULA se conocía originalmente con un nombre diferente, concatenación (y luego conocido como prefijo ), en referencia al hecho de que el código de los supertipos se copiaba y 'concatenaba' con el código de los subtipos. Más tarde surgió otra forma de sistema de herencia , la 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 una 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 refinamiento gradual . Básicamente explica cómo dividir un programa en soluciones parciales en las que se puede extender.
1974 :
Este es el primer artículo que encontré que acuña el término tipos de datos abstractos de Barbara Liskov .
Este documento también define un grupo de operaciones que parece especificar lo que ahora conocemos como interfaz .
Interesante terminología científica (artículo de 1996):
Herencia : un mecanismo de nivel más bajo por el cual los objetos o clases pueden compartir comportamientos 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 ordenaciones de abstracciones, con el fin de obtener una mejor comprensión de los fenómenos en cuestión.
Abstracciones parcialmente implementadas : abstracciones cuyas definiciones se han dejado a propósito incompletas.
Clases abstractas : Término específico para una clase parcialmente implementada en sistemas orientados a objetos.
Herencia no estricta : permite que las operaciones se redefinan (o incluso se eliminen) en subclases.
Herencia estricta : herencia compatible con el comportamiento.
Conclusión :
La 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 parecer que inventó los términos. Los artículos científicos usan 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. Hablar 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 no estricta .
Cualquier persona interesada en ajustar la entrada de wikipedia ? :)
fuente
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 deben ser anuladas absolutamente se llaman "virtuales puras". Tenga en cuenta que una función virtual pura puede tener un cuerpo, aunque a menudo no lo tiene. Una clase que tiene al menos una función virtual pura se llama "abstracta" y no se puede instanciar, solo derivar de.
Supongo que la razón por la cual las funciones virtuales se llaman virtuales es el hecho de que no se sabe qué función real se llamará en tiempo de compilación. En cierto sentido, una función virtual llamada "no existe" en tiempo de compilación.
También supongo que la razón por la cual el término "abstracto" se usa 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 usan enlace dinámico, por lo que todas son virtuales y no se necesita un término especial o una palabra clave de idioma. En Java, si no me equivoco, el compilador decide automáticamente si se debe utilizar el enlace dinámico, por lo que al programador no le corresponde 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 depende del programador decidir cuándo se debe usar el enlace dinámico para ahorrar en la sobrecarga cuando no es necesario.
fuente
dynamic
, que es un tipo de método virtual que intercambia espacio por tiempo: ocupan menos espacio y son más lentos de ejecutar que losvirtual
métodos.