Existem linguagens de programação orientadas a objetos que não se baseiam no paradigma de classe?
Existem linguagens de programação orientadas a objetos que não se baseiam no paradigma de classe?
Respostas:
Até onde eu sei, o Self é a linguagem original que inventou o paradigma "sem classes" baseado em protótipos . Ele já existia (em um estágio experimental) na década de 1980 e leva ao extremo o uso elegante do padrão de protótipo por Smalltalk , de tal forma que as classes são completamente eliminadas.
Ele influenciou todas as outras linguagens OO "sem classe" que eu conheço:
Idiomas como JavaScript são baseados em protótipos , onde o comportamento é reutilizado pela clonagem de objetos existentes. O artigo da Wikipedia ao qual vinculei indica que Lua, ActionScript e várias outras linguagens seguem esse paradigma.
A linguagem de programação orientada a objetos mais popular do mundo não tem classes, é chamada Javascript e é baseada em protótipo: http://en.wikipedia.org/wiki/Prototype-based_programming
Orientação a objetos é um termo genérico para vários conceitos importantes que são apenas parcialmente dependentes um do outro. Por exemplo, a herança pode ser declarada caso a caso entre instâncias, e não entre classes, ou a classe inteira pode ser representada por um prototype
objeto concreto , como Thomas escreveu. É apenas mais comum separar a descrição da estrutura da criação da instância. Da mesma forma, ligação tardia significa que objetos com nominalmente o mesmo método não necessariamente fazem a mesma coisa quando invocados e que a decisão é tomada em tempo de execução. Isso também é possível com a abordagem baseada em protótipo. E o encapsulamento é essencialmente completamente independente de seus objetos serem instâncias de classes declaradas ou não.
Dito isto, a maioria das línguas OO está firmemente no campo de classe. Mas, mesmo assim, há expressões que obscurecem a linha: o design orientado a domínio geralmente leva a sistemas nos quais a identidade de objetos específicos é muito mais importante que o diagrama estático de classes, e os decoradores permitem que objetos da mesma classe ou interface tenham muito comportamento diferente.
Fortress é uma linguagem orientada a objetos baseada em características, em vez de classes. A diferença está principalmente na composição da implementação. O comportamento de um objeto (definições de método) ainda é determinado pelas declarações em um ponto específico no texto do programa. Portanto, nesse sentido, é semelhante aos sistemas baseados em classe.
Existem cálculos de objetos (de Cardelli, eu acho), que são puramente baseados em objetos. Todo método é um membro da instância. Você forma novos objetos pegando o conteúdo de um objeto existente e adicionando, removendo ou substituindo alguns de seus membros. É um pouco diferente dos protótipos, já que o novo objeto não tem vínculo com o objeto antigo, apenas parte de seu conteúdo.
No IIRC, é possível programar de maneira semelhante usando Python e outras linguagens orientadas a hashtable: você pode adicionar uma função como membro da instância e chamá-la como método.
Ada, em sua revisão de 1995, o Ada é orientado a objetos, mas, diferentemente de muitas outras linguagens OO, não combina tipos e módulos orientados a objetos em um único construto chamado "classe". Em vez de declarar um tipo como "classe Foo" e colocar todas as declarações de método associadas dentro da declaração de classe, você declara um pacote e o tipo (como a record
) e outras coisas dentro do pacote. Não é "livre de aulas", como são os outros idiomas mencionados, é apenas uma maneira um pouco diferente de organizar as coisas.
Os recursos orientados a objetos do Ada 95 foram adicionados à versão existente em 1983 da linguagem; estendeu as construções de registro e pacote existentes para apoiar a herança et al.
Io é outra linguagem orientada a objetos baseada em protótipo. Na verdade, ele se inspira em vários dos idiomas já mencionados em outras respostas.
Io é uma linguagem de programação dinâmica baseada em protótipo. As idéias no Io são principalmente inspiradas em Smalltalk (todos os valores são objetos), Self (baseado em protótipo), NewtonScript (herança diferencial), Act1 (atores e futuros para simultaneidade), Lisp (código é uma árvore inspecionável / modificável em tempo de execução) e Lua (pequena, incorporável).
Erlang. E sim, Erlang é uma linguagem orientada a objetos, pois cumpre todos os três pontos da definição de OO.