Tecnicamente falando, C. Embora orientado, é bastante exagerado no sentido da linguagem, facilitando. Sei que esse não é o tipo de resposta que você está procurando, mas se você se interessar em saber como o C pode fazê-lo, poderá fornecer algumas dicas sobre o que as classes realmente fazem e como abordagens alternativas podem funcionar.
kylben
4
@kylben: "Oriented" é um alongamento desnecessário. Você pode prejudicar C no comportamento orientado a objetos. Você não pode convencê-lo a ser orientado dessa maneira.
precisa
Respostas:
74
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:
mais destacadamente Javascript,
a linguagem de programação clássica e o ambiente Squeak (construído sobre o Smalltalk)
@ Adam: sem digitar estática, não é tudo apenas açúcar sintático?
Kevin cline #
5
Linguagem @DeadMG OO não é aquele que permite implementar idéias OO mas que faz isso para você :)
Piotr Dobrogost
4
Na verdade, Simula (1960) e Smalltalk-71 (assim como Smalltalk-72) também não tinham aulas, o que antecede o Self por quase três décadas. As aulas foram adicionadas apenas em Simula-67 e Smalltalk-74 (e Alan Kay as considerou um erro ou, mais precisamente, um mal necessário).
Jörg W Mittag 20/10
2
@ kevincline: Não tenho certeza do que você está baseando; OO e tipagem estática são completamente ortogonais.
precisa
2
Além de Simula (que assumiu o paradigma de classe), o Flavours foi introduzido no MIT em 1979 e foi precursor do CLOS, ambos anteriores ao Self.
Matthew Flynn
32
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.
Qualquer variante ECMAScript usa o paradigma de protótipo.
ZzzzBov 20/10/11
Bem, quase qualquer variante. O ActionScript (a linguagem Flash) usa classes, embora a VM subjacente possa estar implementando-as em termos de protótipos.
Mjfgates 21/10
@mjfgates, o Actionscript 2 costumava ser baseado no ECMAScript e lembrava muito o Javascript. O Actionscript 3 está se afastando disso, mas ainda mantém sua natureza dinâmica. Você pode digitar forte / fraco qualquer variável, pois em essência tudo é um Objeto.
"Linguagem de programação orientada a objetos mais popular do mundo"? Não tenho certeza sobre essa afirmação.
Thomas Owens
8
@ThomasOwens, devido à sua inclusão na Web, você pode facilmente dizer que toda plataforma moderna habilitada para a Web (incluindo dispositivos móveis) tem um interpretador de JavaScript incluído. Esse é um caso muito forte de que atualmente é a linguagem baseada em protótipo mais popular existente. (a menos que você acha que pode fazer um argumento semelhante para "SELF")
riwalk
1
O Javascript é certamente uma das linguagens de programação mais usadas no mundo, mas eu esperaria que a maioria dos usos seja imperativa ou processual antiga, talvez com um pouco de programação orientada a aspectos (retornos de chamada? AJAX? Manipuladores de eventos?) Aqui e, então, chamar o javascript de 'linguagem OOP mais popular' não se justifica.
tdammers
9
Eu também diria "onipresente" para evitar uma discussão sobre os méritos de sua popularidade.
Anthony Pegram 20/10
3
@ Stargazer712: Eu não gosto de ser um fanático por idiomas, mas ele afirma que "a linguagem de programação orientada a objetos mais popular do mundo [ed: Javascript] não tem classes". Ele pode ser decomposto de duas reivindicações: "Javascript é a linguagem de programação orientada a objetos mais popular" e "Javascript não tem classes"; ambos os quais, eu concordo.
Lie Ryan
6
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 prototypeobjeto 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.
isso é o que eu me lembrava, também você precisa para passar o seu registro para cada função membro
Nikko
@ Nikko: É o que acontece nos bastidores em todas as linguagens orientadas a objetos, e de maneira bastante explícita em Python e CLOS (Common Lisp).
Marcin
5
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).
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:
fonte
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.
fonte
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
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte
Erlang. E sim, Erlang é uma linguagem orientada a objetos, pois cumpre todos os três pontos da definição de OO.
fonte