Esistono linguaggi di programmazione orientati agli oggetti che non si basano sul paradigma di classe?
Esistono linguaggi di programmazione orientati agli oggetti che non si basano sul paradigma di classe?
Risposte:
Per quanto ne so, il Sé è il linguaggio originale che ha inventato il paradigma "senza classi" basato su prototipi . Esisteva già (in una fase sperimentale) negli anni '80 e spinge all'estremo l' utilizzo elegante del modello prototipo di Smalltalk , in modo tale che le classi vengano completamente eliminate.
Ha influenzato tutte le altre lingue OO "senza classi" che conosco:
Lingue come JavaScript si basano su prototipi , in cui il comportamento viene riutilizzato clonando oggetti esistenti. L'articolo di Wikipedia che ho collegato indica che Lua, ActionScript e un certo numero di altre lingue seguono questo paradigma.
Il linguaggio di programmazione orientato agli oggetti più popolare al mondo non ha lezioni, si chiama Javascript ed è basato su prototipi: http://en.wikipedia.org/wiki/Prototype-based_programming
L'orientamento agli oggetti è un termine generico per diversi concetti importanti che sono solo parzialmente dipendenti l'uno dall'altro. Ad esempio, l'ereditarietà può essere dichiarata caso per caso tra istanze anziché tra classi, oppure l'intera classe può essere rappresentata da un prototype
oggetto concreto , come ha scritto Thomas. È solo più normale separare la descrizione della struttura dalla creazione dell'istanza. Allo stesso modo, l'associazione tardiva significa che gli oggetti nominalmente con lo stesso metodo non fanno necessariamente la stessa cosa quando vengono invocati e che la decisione viene presa in fase di esecuzione. Ciò è anche possibile con l'approccio basato sul prototipo. E l'incapsulamento è essenzialmente completamente indipendente dal fatto che i tuoi oggetti siano o meno istanze di classi dichiarate.
Detto questo, la maggior parte delle lingue OO sono saldamente nel campo di classe. Ma anche allora ci sono modi di dire che sfocano la linea: il design guidato dal dominio spesso porta a sistemi in cui l'identità di oggetti particolari è molto più importante del diagramma di classe statico e i decoratori consentono agli oggetti della stessa classe o interfaccia di avere molto comportamento diverso.
Fortezza è un linguaggio orientato agli oggetti basato su tratti anziché su classi. La differenza sta principalmente nella composizione dell'attuazione. Il comportamento di un oggetto (definizioni dei metodi) è ancora determinato dalle dichiarazioni in un punto specifico nel testo del programma. Quindi in questo senso è simile ai sistemi basati su classi.
Ci sono calcoli di oggetti (di Cardelli, credo), che sono puramente basati su oggetti. Ogni metodo è un membro di istanza. Si formano nuovi oggetti prendendo il contenuto di un oggetto esistente e aggiungendo, rimuovendo o sostituendo alcuni dei suoi membri. È leggermente diverso dai prototipi, poiché il nuovo oggetto non ha collegamenti al vecchio oggetto, solo alcuni dei suoi contenuti.
IIRC, è possibile programmare in modo simile utilizzando Python e altri linguaggi orientati alla hash: è possibile aggiungere una funzione come membro di istanza e quindi chiamarla come metodo.
Ada, a partire dalla sua revisione del 1995, Ada è orientata agli oggetti, ma a differenza di molti altri linguaggi OO non combina tipi e moduli orientati agli oggetti in un unico costrutto chiamato "classe". Anziché dichiarare un tipo come "classe Foo" e inserire tutte le dichiarazioni dei metodi associati all'interno della dichiarazione di classe, si dichiara un pacchetto e si dichiara il tipo (come a record
) e altre cose all'interno del pacchetto. Non è "privo di classi" come lo sono alcune delle altre lingue menzionate, è solo un modo leggermente diverso di organizzare le cose.
Le caratteristiche orientate agli oggetti di Ada 95 furono aggiunte alla versione esistente del 1983 del linguaggio; ha esteso i record esistenti e i costrutti del pacchetto per supportare l'ereditarietà et al.
Io è un altro linguaggio orientato agli oggetti basato sui prototipi. In realtà trae ispirazione da molte delle lingue già menzionate in altre risposte.
Io è un linguaggio di programmazione dinamico basato su prototipo. Le idee in Io sono per lo più ispirate a Smalltalk (tutti i valori sono oggetti), Self (basato su prototipo), NewtonScript (eredità differenziale), Act1 (attori e futuri per la concorrenza), Lisp (il codice è un albero ispezionabile / modificabile in runtime) e Lua (piccola, integrabile).
Erlang. E sì, Erlang è un linguaggio orientato agli oggetti, in quanto soddisfa tutti e tre i punti della definizione di OO.