¿Hay lenguajes de programación orientados a objetos que no se basan en el paradigma de clase?
¿Hay lenguajes de programación orientados a objetos que no se basan en el paradigma de clase?
Por lo que sé, Self es el idioma original que inventó el paradigma de "clase libre" basado en prototypes . Ya existía (en una etapa experimental) en la década de 1980 y empuja el uso elegante de Smalltalk del patrón de prototipo al extremo, de modo que las clases se eliminen por completo.
Influyó en todos los demás lenguajes OO "sin clase" que conozco:
Los lenguajes como JavaScript son basados en prototipos , donde el comportamiento se reutiliza mediante la clonación de objetos existentes. El artículo de Wikipedia al que he vinculado indica que Lua, ActionScript y varios otros idiomas siguen este paradigma.
La orientación a objetos es un término general para varios conceptos importantes que solo dependen en parte de los demás. Por ejemplo, la herencia se puede declarar caso por caso entre instancias en lugar de entre clases, o la clase entera puede representarse mediante un objeto concreto prototype
, como escribió Thomas. Es más habitual separar la descripción de la estructura de la creación de la instancia. De manera similar, el enlace tardío significa que los objetos con nominalmente el mismo método no necesariamente hacen lo mismo cuando se invoca, y que la decisión se toma en tiempo de ejecución. Esto también es posible con el enfoque basado en prototipos. Y la encapsulación es esencialmente completamente independiente de si sus objetos son instancias de clases declaradas o no.
Dicho esto, la mayoría de los idiomas OO están firmemente en el campamento basado en la clase. Pero incluso entonces hay modismos que confunden la línea: el diseño controlado por dominio a menudo conduce a sistemas en los que la identidad de objetos particulares es mucho más importante que el diagrama de clases estático, y los decoradores permiten que los objetos de la misma clase o interfaz tengan mucho diferente comportamiento.
Fortress es un lenguaje orientado a objetos basado en rasgos en lugar de clases. La diferencia está principalmente en la composición de la implementación. El comportamiento de un objeto (definiciones de métodos) aún está determinado por las declaraciones en un punto específico del texto del programa. Así que en ese sentido es similar a los sistemas basados en clases.
Hay cálculos de objetos (por Cardelli, creo), que están puramente basados en objetos. Cada método es un miembro de instancia. Para formar nuevos objetos, tome el contenido de un objeto existente y agregue, elimine o reemplace algunos de sus miembros. Es un poco diferente de los prototipos, ya que el nuevo objeto no tiene enlace al objeto antiguo, solo parte de su contenido.
IIRC, es posible programar de manera similar usando Python y otros lenguajes orientados a tablas de hash: puedes agregar una función como miembro de la instancia y luego llamarla como método.
Ada, a partir de su revisión de 1995, Ada está orientada a objetos, pero a diferencia de muchos otros lenguajes OO, no combina tipos y módulos orientados a objetos en una sola construcción llamada "clase". En lugar de declarar un tipo como "clase Foo", y poner todas las declaraciones de métodos asociadas dentro de la declaración de clase, declara un paquete y declara el tipo (como record
) y otras cosas dentro del paquete. No es "libre de clases" como lo son algunos de los otros idiomas mencionados, es solo una forma ligeramente diferente de organizar las cosas.
Las características orientadas a objetos de Ada 95 se agregaron a la versión existente de 1983 del lenguaje; extendió el registro existente y las construcciones de paquetes para admitir la herencia et al.
Io es otro lenguaje orientado a objetos basado en prototipos. En realidad, se inspira en varios de los idiomas ya mencionados en otras respuestas.
Io es un lenguaje de programación dinámico basado en prototipos. Las ideas en Io. están inspirados principalmente en Smalltalk (todos los valores son objetos), Self (basado en prototipo), NewtonScript (herencia diferencial), Ley 1 (actores y futuros para la concurrencia), Lisp (el código es un tiempo de ejecución árbol inspeccionable / modificable) y Lua (pequeño, empotrable).
Erlang. Y sí, Erlang es un lenguaje orientado a objetos, ya que cumple con los tres puntos de la definición de OO.
Lea otras preguntas en las etiquetas object-oriented programming-languages