..
Полиморфизм технология программирования, позволяет использование части исходного кода, оставаясь при этом неизменным, генерировать во время выполнения поведение.
Создание полиморфного кода имеет особое значение в объектно-ориентированное программирование: это означает создание таксономии всех классов, которые реализуют интерфейс.
Так что если, например, мой интерфейс определяет метод "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, не нужно указывать интерфейс, ни явного отношения наследования между классами.
Переводчик просто "верить", что программист, метод шагов, когда полиморфный объект, который "должен иметь" определенным образом, мы фактически имеем.
| |
Руби и Ruby On Rails (курс)
Создание программного обеспечения и веб-приложений с Рубином и RoR. С 39 €. |