W informatyce polimorfizm to funkcja języka programowania, która umożliwia obsługę wartości różnych typów danych przy użyciu jednolitego interfejsu.
W programowaniu komputerowym z obiektowymi językami programowania typowanie dynamiczne jest stylem dynamicznego pisania, w którym aktualny zestaw metod i właściwości obiektu określa prawidłową semantykę, a nie jej dziedziczenie po określonej klasie lub implementacji określonego interfejsu.
Moja interpretacja jest taka, że w oparciu o pisanie kaczek metody / właściwości obiektów określają poprawną semantykę. Oznacza to, że obecny kształt obiektów określa interfejs, który obsługuje.
Na podstawie polimorfizmu można powiedzieć, że funkcja jest polimorficzna, jeśli akceptuje wiele różnych typów danych, o ile utrzymują one interfejs.
Jeśli więc funkcja może przechylać się na typ, może akceptować wiele różnych typów danych i działać na nich, dopóki te typy danych mają poprawne metody / właściwości, a tym samym podtrzymują interfejs.
(Użycie terminu interfejs nie jest rozumiane jako konstrukcja kodu, ale raczej jako konstrukcja opisowa, dokumentująca)
- Jaki jest prawidłowy związek między kaczątkiem a polimorfizmem?
- Jeśli język potrafi uchylać się od tekstu, czy oznacza to, że może on polimorfizm?
door.close()
itiger.close()
Odpowiedzi:
Mówię, że polimorfizm jest cechą ogólną, którą można wdrożyć na kilka sposobów:
każdy z nich pozwala programiście używać jednego kodu z różnymi typami, więc wszystkie ucieleśniają koncepcję polimorfizmu.
źródło
Myślę, że:
Zarówno pisanie kaczek, jak i polimorfizm są środkami pośredniczenia / abstrakcji. Polimorfizm to koncepcja oparta na typach i pisaniu na maszynie, podczas gdy pisanie na kaczkach opiera się na umowach.
W przypadku polimorfizmu ważne jest, czym jest RZECZ, a nie jak się zachowuje (zachowanie może być konsekwencją tego, czym jest).
W pisaniu kaczek ważne jest, jak zachowuje się RZECZ. Pisanie kaczką jest bardziej związane z koncepcją obiektów jako aktorów, którzy wymieniają się wiadomościami, niż obiektów, które mają określone właściwości.
źródło
Odpowiedź brzmi TAK .
Duck Typing jest szczególnym przypadkiem dynamicznego typowania , a nawet jeśli dynamiczne typowanie per se nie mogą być bezpośrednio uznawane jako polimorfizm (ponieważ jest to właściwość języka wykonywania typ kontroli w czasie wykonywania, a następnie w czasie kompilacji), techniki, które zwykle leżące u podstaw dynamicznego pisania, takie późne wiązanie i dynamiczne wysyłanie są charakterystyczne dla polimorfizmu .
źródło
Wpisywanie kaczek nie jest całkiem podzbiorem polimorfizmu, ponieważ polimorfizm wymaga jawności, która gubi się w pisaniu kaczek. Tak więc pisanie kaczką ma szansę „zaimplementować” „interfejs” nie dlatego, że ma to sens semantyczny, ale dlatego, że masz ten sam podpis. Gdyby pisanie kaczek było podzbiorem polimorfizmu, wówczas miałoby ono wszystkie właściwości polimorfizmu, w tym wyraźną deklarację.
Pisanie kaczek również nie jest tak naprawdę implementacją polimorfizmu, jest częścią innego systemu typów. Zazwyczaj kojarzysz pisanie z kaczką z dynamicznym językiem, który idzie naprzód i przekazuje komunikat do obiektu, nie wiedząc, czy obiekt może go obsłużyć - jeśli tak, to skutecznie przeszedł test pisania kaczki. Zwykle myślisz o polimorfizmie jako implementowanym w czasie kompilacji poprzez konfigurację vtables (i itables, jeśli interfejsy są inne niż klasy). Ale istnieje wiele języków i wiele sposobów na wdrożenie tych funkcji.
W pewnym stopniu jest to pytanie filozoficzne. Czy możesz myśleć o pisaniu kaczek jako interfejsach, które są automatycznie deklarowane niejawnie? Nie mogę wymyślić żadnego niewłaściwego powodu , ale nie sądzę, że jest to prawdopodobnie najbardziej produktywny sposób na to. Wydaje mi się, że pisanie kaczek i interfejsy to często spotykane cechy systemów typów języka programowania, oba mają dość podobny sposób zachowania i oba są ważne dla programistów.
źródło
Prawie naturalne jest powiedzenie „Tak, jeśli foo ma kaczkę, foo ma polimorfizm”. Ale nie mogę powiedzieć tego w 100% pewien, że w pewnym sensie może to jest możliwe, aby wymyślić przykłady sztucznych takiego systemu, który ma kaczkę wpisywanie ( "może to szarlatan && może unosić się na wodzie ==> to jest Kaczka ”), chociaż nie ma polimorfizmu („ foo, kwak! ”Zawodzi), ale naprawdę byłyby sztuczne i w prawdziwym świecie powiedziałbym„ Tak, jeśli typowanie kaczki jest obecne, polimorfizm również musi być obecny ”.
Osobiście widzę, że pisanie kaczek to „polimorfizm zrobiony dobrze”. Rozumiem przez to, że rzeczy, które istnieją w świecie kaczych typów, nie muszą mieć żadnych wyraźnych typów, a ich zachowanie (polimorficzne = „taki sam dostęp, inny wynik”) jest jedyną rzeczą, która się liczy. W innych implementacjach polimorfizmu jest on ograniczony do typów / interfejsów / dziedziczenia, więc jest „zaimplementowany i ograniczony polimorfizm”, a nie „polimorfizm per se”.
źródło
(B. Pierce i przyjaciele)
Tak więc, jak można zauważyć, pod tym względem pisanie kaczką jest pisaniem dynamicznym, ale naprawdę jest inaczej.
Istnieje pewna metoda określania typu, który odnosi się do polimorfizacji, np. Która uelastycznia kod, ale pisanie z kaczką to zupełnie inna kwestia w tych przypadkach.
W szczegółach jest typowany rachunek lambda i niepisany rachunek lambda, które pomagają określić właściwość obliczeń i obliczeń.
Widzę również, że takie rzeczy, jak pisanie kaczek, mogą pomóc, jeśli chcemy tylko szybko uzyskać wynik, ale przy innych okazjach czuję też, że dynamiczna natura sprawia, że jest bardziej dostosowany do potrzeb, dzięki czemu mogę szybciej obliczać. Myślę, że to tylko powiedzieć, kochanie, że jeśli naprawdę wiem, co chcę już obliczyć, najlepiej pisać na maszynie, ale dlaczego mam wiedzieć, czego chcę? Hehehe ...
To moje pięć centów i myślę, że może to stanowić ciekawy temat badawczy.
źródło