Pytanie Dlaczego języki dynamiczne, takie jak Ruby i Python, nie mają koncepcji interfejsów, takich jak Java czy C #?


Ku mojemu zaskoczeniu, ponieważ coraz bardziej interesuję się językami dynamicznymi, takimi jak Ruby i Python. Twierdzą, że są one w 100% zorientowane obiektowo, ale jak czytam na kilku podstawowych pojęciach takich jak interfejsy, przeciążanie metod, przeciążanie operatorów. Czy jest w jakiś sposób wbudowany pod osłoną, czy te języki po prostu jej nie potrzebują? Jeśli ta ostatnia jest prawdziwa, to czy są one w 100% zorientowane na obiekt?

EDYCJA: Na podstawie niektórych odpowiedzi widzę, że przeciążanie jest dostępne zarówno w Pythonie, jak i Ruby, tak jest w Ruby 1.8.6 i Pythonie 2.5.2 ??


14
2018-04-03 20:26


pochodzenie


Nie pamiętam przeciążania metod lub przeciążania operatorów, które są wymagane dla języka OO. Jednak słyszałem argument, że nie są one OO. - Terry Wilcox
Ze wszystkich wymienionych języków Java jest jedynym bez przeciążania operatora. Przeciążanie metod nie jest związane z OOP; C ma przeciążenie metody. - Pesto
Możesz przeciążyć operatorów w Rubim 1,8,6 - Ed S.
PHP ma interfejs. - Zamrony P. Juhara


Odpowiedzi:


Dzięki późnej oprawie, nie potrzebują tego. W języku Java / C # interfejsy służą do deklarowania, że ​​niektóre klasy mają określone metody i są sprawdzane podczas kompilacji; w języku Python sprawdzanie, czy metoda istnieje, jest sprawdzane w czasie wykonywania.

Przeciążanie metod w Pythonie działa:

>>> class A:
...  def foo(self):
...    return "A"
...
>>> class B(A):
...  def foo(self):
...    return "B"
...
>>> B().foo()
'B'

Czy są obiektowe? Powiedziałbym tak. Jest to raczej podejście, niż jakikolwiek konkretny język ma funkcję X lub funkcja Y.


17
2018-04-03 20:29



Niestety nie jest to przeciążanie metody. To, co robisz, to nadpisywanie metod. Przeciążanie metod / funkcji to możliwość ponownego użycia tej samej nazwy, ale z innym podpisem, jak w: func a (String a); func a (Int a) ;. W twoim przykładzie używasz metody z tą samą sygnaturą, ale overriden w podklasie. Wikipedia - przeciążenie i Wikipedia - przesłanianie - dryajov


Języki dynamiczne pisanie kaczek. Każdy kod może wywoływać metody na dowolnym obiekcie, który obsługuje te metody, więc koncepcja interfejsów jest obcy. Python faktycznie obsługuje przeciążenie operatora, jak robi Rubin.

W każdym razie wydajesz się skupiać na aspektach, które nie są niezbędne programowanie obiektowe. Główny nacisk kładziony jest na takie pojęcia jak enkapsulacja, dziedziczenie i polimorfizm, które są w 100% obsługiwane w Pythonie i Ruby.


18
2018-04-03 20:30





Mogę mówić tylko po pytonie, ale tam zostały propozycje interfejsów jak również w przeszłości pisane w domu przykłady interfejsów.

Jednak sposób, w jaki python działa z obiektami dynamicznie, w pewnym stopniu zmniejsza potrzebę (i korzyści) interfejsów.

Dzięki dynamicznemu językowi bindowanie typów odbywa się w czasie wykonywania - interfejsy są najczęściej używane do kompilowania ograniczeń czasowych na obiektach - jeśli dzieje się to w środowisku wykonawczym, eliminuje to część potrzebnych interfejsów.


5
2018-04-03 20:31





polimorfizm oparty na nazwach

"Dla tych z Was, którzy nie znają Pythona, oto krótkie wprowadzenie do polimorfizmu opartego na nazwach. Obiekty Pythona mają wewnętrzny słownik zawierający ciąg znaków dla każdego atrybutu i metody.Kiedy uzyskujesz dostęp do atrybutu lub metody w kodzie Pythona, Python po prostu spogląda w górę ciąg znaków w dykcie. Jeśli więc chcesz, aby klasa działała jak plik, nie musisz dziedziczyć z pliku, po prostu stwórz klasę, która ma metody plików, które są potrzebne.

Python definiuje również grupę specjalnych metod, które są wywoływane przez odpowiednią składnię. Na przykład a + b jest odpowiednikiem a.Dodaj(b). Jest kilka miejsc wewnątrz Pythona, w których bezpośrednio manipuluje obiektami wbudowanymi, ale polimorfizm oparty na nazwach działa tak, jak oczekujesz w 98% przypadków. "


2
2018-04-03 20:34





Python zapewnia operatorowi przeciążenie, np. możesz zdefiniować metodę __add__jeśli chcesz przeładować +.

Zazwyczaj nie trzeba zapewniać przeciążania metod, ponieważ można przekazać dowolne parametry w jedną metodę. W wielu przypadkach ta pojedyncza metoda może mieć jedno ciało, które działa na wszystkie rodzaje obiektów w ten sam sposób. Jeśli chcesz mieć inny kod dla różnych typów parametrów, możesz sprawdzić typ lub podwójną wysyłkę.

Interfejsy są w większości zbędne z powodu pisania kaczkami, jak zaznacza to operator rentgenowski. Kilka pozostałych przypadków zostało omówionych w Pythonie przez ABC (abstrakcyjne klasy podstawowe) lub interfejsy Zope.


1
2018-04-03 20:34