Gibt es objektorientierte Programmiersprachen , die nicht auf dem Klassenparadigma basieren?
Gibt es objektorientierte Programmiersprachen , die nicht auf dem Klassenparadigma basieren?
Antworten:
Soweit ich weiß, ist Self die Originalsprache, die das "klassenlose" Paradigma erfunden hat, das auf Prototypen basiert . Es existierte bereits (in einem experimentellen Stadium) in den 1980er Jahren und treibt Smalltalks elegante Verwendung des Prototypmusters auf die Spitze, so dass Klassen vollständig beseitigt werden.
Es beeinflusste alle anderen "klassenfreien" OO-Sprachen, die ich kenne:
Sprachen wie JavaScript basieren auf Prototypen , bei denen das Verhalten durch Klonen vorhandener Objekte wiederverwendet wird. Der Wikipedia-Artikel, auf den ich verlinkt habe, zeigt an, dass Lua, ActionScript und eine Reihe anderer Sprachen diesem Paradigma folgen.
Die beliebteste objektorientierte Programmiersprache der Welt hat keine Klassen, sie heißt Javascript und basiert auf einem Prototyp: http://en.wikipedia.org/wiki/Prototype-based_programming
Objektorientierung ist ein Überbegriff für mehrere wichtige Konzepte, die nur teilweise voneinander abhängig sind. Zum Beispiel kann die Vererbung von Fall zu Fall zwischen Instanzen und nicht zwischen Klassen deklariert werden, oder die gesamte Klasse kann durch ein konkretes prototype
Objekt dargestellt werden, wie Thomas schrieb. Es ist nur üblicher, die Strukturbeschreibung von der Instanzerstellung zu trennen. In ähnlicher Weise bedeutet eine späte Bindung, dass Objekte mit nominell derselben Methode nicht unbedingt dasselbe tun, wenn sie aufgerufen werden, und dass die Entscheidung zur Laufzeit getroffen wird. Dies ist auch mit dem prototypbasierten Ansatz möglich. Die Kapselung ist im Wesentlichen völlig unabhängig davon, ob Ihre Objekte Instanzen deklarierter Klassen sind oder nicht.
Die meisten OO-Sprachen sind jedoch fest im Klassencamp verankert. Aber selbst dann gibt es Redewendungen, die die Grenze verwischen: Das domänengetriebene Design führt häufig zu Systemen, in denen die Identität bestimmter Objekte viel wichtiger ist als das statische Klassendiagramm, und Dekoratoren lassen Objekte derselben Klasse oder Schnittstelle sehr viel zu anderes Verhalten.
Fortress ist eine objektorientierte Sprache, die auf Eigenschaften anstatt auf Klassen basiert. Der Unterschied liegt hauptsächlich in der Zusammensetzung der Implementierung. Das Verhalten eines Objekts (Methodendefinitionen) wird weiterhin durch die Deklarationen an einer bestimmten Stelle im Programmtext bestimmt. In diesem Sinne ähnelt es klassenbasierten Systemen.
Es gibt Objektkalküle (von Cardelli, glaube ich), die rein objektbasiert sind. Jede Methode ist ein Instanzmitglied. Sie bilden neue Objekte, indem Sie den Inhalt eines vorhandenen Objekts übernehmen und einige seiner Mitglieder hinzufügen, entfernen oder ersetzen. Es unterscheidet sich geringfügig von Prototypen, da das neue Objekt keine Verknüpfung zum alten Objekt hat, sondern nur einen Teil seines Inhalts.
IIRC, es ist möglich, auf ähnliche Weise mit Python und anderen hashtabellenorientierten Sprachen zu programmieren: Sie können eine Funktion als Instanzmitglied hinzufügen und sie dann als Methode aufrufen.
Ada, seit seiner Revision von 1995, ist Ada objektorientiert, kombiniert jedoch im Gegensatz zu vielen anderen OO-Sprachen objektorientierte Typen und Module nicht in einem einzigen Konstrukt, das als "Klasse" bezeichnet wird. Anstatt einen Typ als "Klasse Foo" zu deklarieren und alle zugehörigen Methodendeklarationen in die Klassendeklaration einzufügen, deklarieren Sie ein Paket und deklarieren den Typ (als a record
) und andere Dinge im Paket. Es ist nicht so "klassenfrei" wie einige der anderen erwähnten Sprachen, es ist nur eine etwas andere Art, Dinge zu organisieren.
Die objektorientierten Funktionen von Ada 95 wurden in die bestehende Version der Sprache von 1983 aufgenommen. es erweiterte die bestehenden Record- und Package-Konstrukte, um die Vererbung et al. zu unterstützen.
Io ist eine weitere prototypbasierte objektorientierte Sprache. Es wurde tatsächlich von mehreren Sprachen inspiriert, die bereits in anderen Antworten erwähnt wurden.
Io ist eine dynamische prototypbasierte Programmiersprache. Die Ideen in Io basieren hauptsächlich auf Smalltalk (alle Werte sind Objekte), Self (prototypbasiert), NewtonScript (differenzielle Vererbung), Act1 (Akteure und Zukünfte auf Parallelität), Lisp (Code ist ein zur Laufzeit inspizierbarer / modifizierbarer Baum) und Lua (klein, einbettbar).
Erlang. Und ja, Erlang ist eine objektorientierte Sprache, da sie alle drei Punkte der Definition von OO erfüllt.