..


Linki sponsorowane

Polimorfizm i Wpisanie Kaczka w Ruby

Artykuł napisany przez Alessio Saltarini
Strona 1 z 2

Polimorfizm to technika programowania, które umożliwia korzystanie z części kodu źródłowego, który, pozostając bez zmian, generują run-time zachowania.

Utwórz kod polimorficzny ma znaczenie w programowaniu obiektowym: oznacza stworzenie taksonomii klas wszystkich zaimplementować ten sam interfejs.

Więc jeśli, na przykład, mój interfejs definiuje metodę "getArea", każda klasa, która implementuje ten interfejs będzie miała metoda "getArea": ​​pozwala nam napisać polimorficzny, metody, które mogą zmienić ich wykonania algorytmu W zależności od typu obiektu, który jest przekazywany jako argument.

Polimorfizm w tradycyjnych języków OOP

W języku Java - ale to samo w C + + i inne języki obiektowe (OO) wypełniony, wtedy zobaczymy, a nie przypadku Ruby - przykład:






 Interfejs IFormaGeometrica







 {



   



 void getArea ();







 }









 publicznych Triangle klasa implementuje IFormaGeometrica







 {



 



 @ Override



 



 public int getArea ()



 



 {



  



 return (* this.base this.altezza) / 2;



 



 }







 }



W tym przypadku możemy zdefiniować interfejs IFormaGeometrica który stanowi, że każdy obiekt, że "jest" FormaGeometrica getArea będzie miał metody - na przykład Trójkąt klasy, która jest FormaGeometrica, ma własną implementację getArea, co pozwala nam napisać program w stanie obliczyć zakresie żadnych kształcie geometrycznym, nawet ten obecny jest dzisiaj w kodzie i które będą realizowane w przyszłości, bez zmiany oryginalnego kodu źródłowego.

W rzeczywistości, jeśli piszę Kalkulator klasy:






 public final Kalkulator klasy







 {





 



 public static void main (String [] args)



 



 {



  



 Formy Collection <IFormaGeometrica> =



          



 <IFormaGeometrica> New ArrayList ();





  



 forme.add (nowy Trójkąt ());



  



 forme.add (nowe Square ());



  



 forme.add (nowe Pentagon ());





  



 do (g IFormaGeometrica: formy)



  



 {



   



 System.out.println (g.calcolaArea ());



  



 }



 



 }







 }



Może to potrwać jako wkład każdego zbioru kształtów geometrycznych, pod warunkiem, że każdy obiekt w kolekcji IFormaGeometrica implementuje interfejs, i że zasadniczo getArea metody. Ten Java przykład ma charakter czysto akademicki: w rzeczywistości, prawdopodobnie w konstruktorze każdej klasy, obejmują środki wejścia stronach kształcie geometrycznym, apothem, i tak dalej.

Cel ten osiąga się: pisaliśmy klasy, która może drukować ekranie obszar dowolnego kształtu geometrycznego. Powtarzam: jest to kod, który został już wdrożony (jak w przypadku trójkąta), czy jest to realizowane w przyszłości.

Nie tylko, że jeżeli wykonanie obliczeń Trójkącie zawierał błędów, można zmienić klasy Triangle, bez konieczności przepisywania Kalkulator klasy. Może to był zainstalowany na serwerze, który wymaga ponownego uruchomienia każdej zmianie: w tym przypadku nie musi zmienić kod jest główną zaletą. Ale poza tym, to zawsze jest korzystne, w celu ograniczenia części kodu, że "zmiany", ponieważ każda zmiana niesie ze sobą potencjalne błędy. Z drugiej strony, jest to dobra praktyka programowania, aby zawsze wiedzieć na pewno, jakie części kodu, który pozostaje bez zmian.

Co się dzieje "za kulisami" jest to, że kompilator gwarantuje, że każdy obiekt wewnątrz kod polimorficzny główną metodą Kalkulator klasa implementuje interfejs. W ten sposób, to powiedział, jest wyrazem za pomocą metodologii projektu umowy "umowy są przestrzegane."

Jeśli nie, jeżeli jest to "formy" mamy obiekt klasy, która nie ma na celu wykonanie IFormaGeometrica błąd w czasie kompilacji, lub nie udaje się uruchomić program, ponieważ kompilator nie zauważy błędu.

Polimorfizm w Ruby

Ale co się dzieje w Ruby? I "możliwe w Ruby, który nie jest kompilowany, ale interpretacji języka, pisanie polimorficzne metody?

Tak, to jest oczywiście możliwe, ale istnieje głęboka różnica "filozoficznej" niż języki OO i skompilowany, które

możemy opisać. W programowaniu obiektowym w języku Java i klasyczne, w celu ustalenia, że ​​obiekt należy do określonego typu obiektów (tj. realizuje pewien interfejs) muszą wyraźnie wynikać obiektu z klasy nadrzędnej: zasadniczo należy używać technik dziedziczenia (dziedziczenie przez klasy, klasy abstrakcyjnej lub interfejsu).

To tak, jakby mówiąc: Aby określić, czy jest to kaczka przede mną, biorę jego DNA i badania w laboratorium, aby sprawdzić czy jest kaczka.

W Ruby używasz "test kaczka" (test kaczka) wymyślił James Riley (patrz http://en.wikipedia.org/wiki/Duck_typing ):

jeśli chodzi jak kaczka i kwacze jak kaczka, to jest to kaczka.

(Co zresztą jest to, co sprawia, że ​​każdy z nas, gdy widzi kaczka).

Co to oznacza? Oznacza to, że w Ruby, a bardziej ogólnie w obiektowych języków skryptowych, jak Python i Perl, nie trzeba określać interfejsu, ani wyraźnej relacji dziedziczenia pomiędzy klasami.

Po prostu interpreter "wierzy", że programista czy metoda działania polimorficzny obiekt, który "powinien" w określony sposób, to musimy.

W tej samej kategorii ...
E-Learning
Ruby i Ruby On Rails (Kurs) Ruby i Ruby On Rails (Kurs)
Tworzenie oprogramowania i aplikacji webowych w języku Ruby RoR. Począwszy od 39 €.
Linki sponsorowane