..


Рекламные ссылки

Полиморфизм и Duck Typing в Рубине

Статья написана Алессио Saltarini
Страница 1 из 2

Полиморфизм технология программирования, позволяет использование части исходного кода, оставаясь при этом неизменным, генерировать во время выполнения поведение.

Создание полиморфного кода имеет особое значение в объектно-ориентированное программирование: это означает создание таксономии всех классов, которые реализуют интерфейс.

Так что если, например, мой интерфейс определяет метод "GetArea", каждый класс, который будет реализовывать этот интерфейс будет иметь метод "GetArea": ​​это позволяет нам писать полиморфные методы, методы, которые могут изменить свой алгоритм выполнения В зависимости от типа объекта, который передается в качестве аргумента.

Полиморфизм в традиционных языках ООП

В Java, - но то же самое верно для C + + и любой другой язык, объектно-ориентированного (ОО) завершена, мы будем рука случае Ruby - например:






 Интерфейс IFormaGeometrica







 {



   



 недействительным GetArea ();







 }









 общественных Треугольник класс реализует IFormaGeometrica







 {



 



 @ Override



 



 общественных Int GetArea ()



 



 {



  



 возвращение (* this.base this.altezza) / 2;



 



 }







 }



В этом случае мы определяем интерфейс IFormaGeometrica в котором говорится, что каждый объект, который "является" FormaGeometrica GetArea будет иметь метод - такие, как треугольник класса, который FormaGeometrica, имеет свою собственную реализацию GetArea, что позволяет писать программы в состоянии вычислить площадь любой геометрической формы, будь то в настоящее время в коде и которые будут реализованы в будущем, без изменения исходного кода.

На самом деле, если я пишу класс Калькулятор:






 общественности окончательный Калькулятор класса







 {





 



 государственной статической силы основных (String [] агдз)



 



 {



  



 Коллекция форм <IFormaGeometrica> =



          



 <IFormaGeometrica> Новый ArrayList ();





  



 forme.add (в новом треугольнике ());



  



 forme.add (новые площади ());



  



 forme.add (новые Пентагона ());





  



 для (IFormaGeometrica г: форма)



  



 {



   



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



  



 }



 



 }







 }



Это может занять в качестве входных данных любой набор геометрических фигур, при условии, что каждый объект в коллекции должен быть реализован интерфейс IFormaGeometrica, и что, по сути, метод GetArea. Этот пример в Java является чисто академическим: на самом деле, вероятно, в конструкторе каждого класса, мы будем включать входной меры из сторон геометрической формы, наклона, и так далее.

Цель достигнута: мы написали класс, который может печатать на видео площади любой геометрической формы. Я повторяю: это код, который уже был реализован (как в случае с треугольником), который реализуется в будущем.

Мало того: если осуществление расчетов Треугольник области, содержащиеся ошибка, я могу изменить класс без необходимости переписывать класс Калькулятор треугольника. Может быть, это был развернут на сервере, который необходимо перезагрузить каждое изменение: в этом случае не меняя код является основным преимуществом. Но кроме этого, это всегда выгодно ограничить части кода, что "изменение", потому что каждое изменение несет в себе потенциальные ошибки. С другой стороны, это хорошая практика программирования, чтобы всегда знать с уверенностью, какие части кода, которые остаются неизменными.

Что происходит "за кулисами", является то, что компилятор гарантирует, что каждый объект в полиморфный код основного метода класса Калькулятор реализует интерфейс. Таким образом, по их словам, выражение, используя методологию проектирования по контракту ", контракт с уважением".

Если нет, если это в "формах" есть объект класса, который мы не будет выполнять IFormaGeometrica ошибку во время компиляции, или не удается запустить программу, потому что компилятор не заметит ошибку.

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

Но что происходит в Ruby? И "возможно в Рубине, который не компилируется, но интерпретируемый язык, писать полиморфные методы?

Да, это, конечно, возможно, но есть глубокое различие "философского", чем языки ОО и скомпилирован, которые

мы могли бы описать его. Ориентированное программирование в Java и классика, чтобы установить, что объект принадлежит к определенному типу объектов (который реализует определенный интерфейс) должны прямо объекта вывести из родительского класса: в основном вы должны использовать технику наследования (наследование на класс, абстрактный класс или интерфейс).

Это походило бы говоря: Чтобы определить, является ли это утка передо мной, я беру его ДНК и изучить в лаборатории, чтобы увидеть, если он является утка.

В Ruby вы используете "утка тест" (утка тест) изобрел Джеймсом Райли (см. http://en.wikipedia.org/wiki/Duck_typing ):

если он ходит, как утка и крякает как утка, то это утка.

(Который, кстати, что делает каждый из нас, когда он видит, утки).

Что это значит? Это означает, что в Ruby, и в целом в объектно-ориентированных языков сценариев, а также Python и Perl, не нужно указывать интерфейс, ни явного отношения наследования между классами.

Переводчик просто "верить", что программист, метод шагов, когда полиморфный объект, который "должен иметь" определенным образом, мы фактически имеем.

В той же категории ...
E-Learning
Руби и Ruby On Rails (курс) Руби и Ruby On Rails (курс)
Создание программного обеспечения и веб-приложений с Рубином и RoR. С 39 €.
Рекламные ссылки