..


Спонсоред Линкс

Полиморфизам и патке да куцате у Руби

Чланак који је написао Алессио Салтарини
Страна 1 од 2

Полиморфизам је програмирање техника која омогућава коришћење делова изворног кода који, остајући непромењена, генерише рун-тиме понашања.

Направи полиморфни код има посебно значење у објектно-оријентисаном програмирању: значи стварање номенклатура класа које имплементира све истог интерфејса.

Тако да ако, на пример, мој интерфејс дефинише метод "гетАреа", свака класа која ће реализовати овај интерфејс ће имати методу "гетАреа" Ово нам омогућава да пишу полиморфних метода, методе које могу да промене њиховог извршења алгоритма У зависности од типа објекта који се преноси као аргумент.

Полиморфизам у традиционалним ООП језицима

У Јава - али исто важи и за Ц + + и било ког другог језика Објектно оријентисано (ОО) заврши, онда ћемо уместо тога видимо случај Руби - на пример:






 интерфејс ИФормаГеометрица







 {



   



 гетАреа воид ();







 }









 јавни час троугао реализује ИФормаГеометрица







 {



 



 @ Оверриде



 



 публиц воид гетАреа ()



 



 {



  



 повратак (* тхис.басе тхис.алтезза) / 2;



 



 }







 }



У овом случају дефинишемо интерфејс ИФормаГеометрица који каже да сваки објекат који "је" ФормаГеометрица гетАреа ће имати метод - на пример, класе троугао, који је ФормаГеометрица, има своју примену гетАреа, што нам омогућава да напише програм у стању да израчуна области било геометријски облик, да ли је то данас присутна у коду и да ће се реализовати у будућности, без промене оригиналног изворног кода.

У ствари, ако пишем класе Калкулатор:






 јавности коначно класе Калкулатор







 {





 



 публиц статиц воид маин (Стринг [] аргс)



 



 {



  



 Колекција форме <ИФормаГеометрица> =



          



 <ИФормаГеометрица> Нев АрраиЛист ();





  



 форме.адд (нови Троугао ());



  



 форме.адд (нови трг ());



  



 форме.адд (нови Пентагона ());





  



 за (Г ИФормаГеометрица: облици)



  



 {



   



 Систем.оут.принтлн (г.цалцолаАреа ());



  



 }



 



 }







 }



Ово може да потраје као улаз сваки скуп геометријских облика, под условом да сваки објекат у колекцији ИФормаГеометрица имплементира интерфејс, као и да је у суштини метод гетАреа. Овај пример Јава је чисто академски: у ствари, вероватно у конструктор сваке класе, укључујемо улаз мере стране геометријског облика, апотхем, и тако даље.

Циљ је постигнут: смо писали класе која може Принт Сцреен на подручју било које геометријског облика. Понављам: ово је код који је већ имплементиран (као у случају троугла), да ли је спроведен у будућности.

Не само да ако имплементација прорачуна Површина троугла садржи грешку, могу да промене класу Троугао без потребе да препише Калкулатор класе. Можда је то био распоређен на серверу који треба поново да покренете било коју промену: у овом случају не мора да мења код је велика предност. Али, осим тога, увек је пожељно да се ограничи делове кода који "промена", јер свака промена носи са собом потенцијалне грешке. Насупрот томе, добро је програмирање пракса да се увек са сигурношћу знали који делови кода који остаје непромењен.

Шта се дешава "иза кулиса" је да компајлер проверава да ли је сваки објекат у полиморфни код основни метод класе Калкулатор имплементира интерфејс. На овај начин, речено је је израз користи методологију пројектовања на основу уговора ", уговор се поштује."

Ако не, ако је то у "форми" су објекат класе која не бисмо имплементирати ИФормаГеометрица грешке у компајлирања, или не успева да покрене програм, јер компајлер би приметио грешку.

Полиморфизам у Рубин

Али шта се дешава у Руби? И "могуће у Руби, који није саставио, али тумачити језику, писање полиморфни методе?

Да, сигурно је могуће, али постоји суштинска разлика "филозофски" него оо језика и саставио, који

могли бисмо да се опише. У ОО програмирању у Јави и класичне, да се утврди да објекат припада одређеном типу предмета (тј. имплементира одређени интерфејс) треба да јасно произилазе објекат из класе родитеља: у основи потребно је да користите технике наслеђивања (наслеђивања од класе, апстрактна класа или интерфејса).

Било би исто као да кажеш: Да бисте утврдили да ли је то патка испред мене, узимам његов ДНК и студије у лабораторији да види да ли је патка.

У Руби користите "патка теста" (патка теста) измислио Џејмс Рајли (види хттп://ен.википедиа.орг/вики/Дуцк_типинг ):

ако хода као патка и куацкс као патка, онда је патка.

(Који иначе је оно што чини сваког од нас када види патке).

Шта то значи? То значи да у Руби, и уопште у објектно-оријентисаних језика за писање скрипти, као и Питхон и Перл, нема потребе да одредите интерфејс, нити експлицитно наслеђе односа између класа.

Једноставно преводилац "верује" да је програмер ако метод корака полиморфни објекат који "би требало да имају" известан начин, ми заправо имају.

У истој категорији ...
Е-учење
Руби и Руби Он Раилс (курс) Руби и Руби Он Раилс (курс)
Креирање софтвера и Веб апликација са рубином и РОР. Полазећи од 39 €.
Спонсоред Линкс