Czy są jakieś zorientowane obiektowo języki programowania, które nie są oparte na paradygmacie klas?
Czy są jakieś zorientowane obiektowo języki programowania, które nie są oparte na paradygmacie klas?
Odpowiedzi:
O ile mi wiadomo, Self jest oryginalnym językiem, który wynalazł paradygmat „bezklasowy” oparty na prototypach . Istniał już (w fazie eksperymentalnej) w latach 80. XX wieku i popycha eleganckie wykorzystanie prototypowego wzoru Smalltalk do granic możliwości, dzięki czemu klasy są całkowicie eliminowane.
Wpłynął na wszystkie inne znane mi języki OO „bezklasowe”:
Języki takie jak JavaScript oparte są na prototypach , w których zachowanie jest ponownie wykorzystywane przez klonowanie istniejących obiektów. Artykuł w Wikipedii, do którego odsyłam, wskazuje, że Lua, ActionScript i wiele innych języków są zgodne z tym paradygmatem.
Najpopularniejszy obiektowy język programowania na świecie nie ma klas, nazywa się Javascript i jest oparty na prototypach: http://en.wikipedia.org/wiki/Prototype-based_programming
Orientacja obiektowa to ogólny termin na kilka ważnych pojęć, które tylko częściowo zależą od siebie. Na przykład, dziedziczenie może być zadeklarowane indywidualnie dla poszczególnych przypadków między instancjami, a nie między klasami, lub cała klasa może być reprezentowana przez konkretny prototype
obiekt, jak napisał Thomas. Po prostu częściej oddziela się opis struktury od tworzenia instancji. Podobnie późne wiązanie oznacza, że obiekty przy użyciu nominalnie tej samej metody niekoniecznie robią to samo po jej wywołaniu i że decyzja jest podejmowana w czasie wykonywania. Jest to również możliwe dzięki podejściu opartemu na prototypach. A enkapsulacja jest zasadniczo całkowicie niezależna od tego, czy Twoje obiekty są instancjami zadeklarowanych klas, czy nie.
To powiedziawszy, większość języków OO jest zdecydowanie w obozie klasowym. Ale nawet wtedy istnieją idiomy, które zacierają linię: projekt oparty na domenie często prowadzi do systemów, w których tożsamość poszczególnych obiektów jest znacznie ważniejsza niż schemat klasy statycznej, a dekoratorzy pozwalają obiektom tej samej klasy lub interfejsu mieć bardzo inne zachowanie.
Fortress to zorientowany obiektowo język oparty na cechach zamiast klas. Różnica polega głównie na składzie implementacji. Zachowanie obiektu (definicje metod) jest nadal określane przez deklaracje w określonym punkcie tekstu programu. W tym sensie jest podobny do systemów opartych na klasach.
Są kalkulacje obiektowe (jak sądzę Cardelli), które są oparte wyłącznie na obiektach. Każda metoda jest członkiem instancji. Tworzysz nowe obiekty, biorąc zawartość istniejącego obiektu i dodając, usuwając lub zastępując niektóre z jego elementów. Różni się nieco od prototypów, ponieważ nowy obiekt nie ma linku do starego obiektu, tylko część jego zawartości.
IIRC można programować w podobny sposób za pomocą Pythona i innych języków zorientowanych na hashtable: możesz dodać funkcję jako element instancji, a następnie wywołać ją jako metodę.
Ada, od wersji z 1995 roku, Ada jest zorientowana obiektowo, ale w przeciwieństwie do wielu innych języków OO, nie łączy typów i modułów zorientowanych obiektowo w jedną konstrukcję zwaną „klasą”. Zamiast deklarować typ jako „klasę Foo” i umieszczać wszystkie powiązane deklaracje metod w deklaracji klasy, deklarujesz pakiet i deklarujesz typ (jako a record
) i inne rzeczy w pakiecie. To nie jest „bezklasowe”, tak jak niektóre inne wspomniane języki, to tylko nieco inny sposób organizowania rzeczy.
Funkcje obiektowe Ada 95 zostały dodane do istniejącej wersji języka z 1983 roku; rozszerzył istniejące konstrukcje rekordów i pakietów, aby wesprzeć dziedziczenie i in.
Io to kolejny oparty na prototypach język obiektowy. W rzeczywistości czerpie inspirację z kilku języków wspomnianych już w innych odpowiedziach.
Io to dynamiczny język programowania oparty na prototypach. Pomysły w Io są głównie inspirowane Smalltalk (wszystkie wartości są obiektami), Self (oparty na prototypach), NewtonScript (dziedziczenie różnicowe), Act1 (aktorzy i futures dla współbieżności), Lisp (kod jest drzewem kontrolowanym / modyfikowalnym w czasie wykonywania) i Lua (mały, do osadzenia).
Erlang. I tak, Erlang jest językiem obiektowym, ponieważ spełnia wszystkie trzy punkty definicji OO.