Полиморфизм

Рассмотрим ещё одного из китов объектно-ориентированного программирования – полиморфизм. Что это такое, и как его применять на практике.

Давайте разберем, что же такое полиморфизм, на примере принтера и документов, которые на нем печатаются. В данной идеологии у нас есть единый интерфейс – принтер, который выводит содержимое документа на бумагу. Ему не важно, какой документ отправлен на печать – изображение, таблица или текст. Все, что ему нужно сделать, это вызвать общий метод – печать данного интерфейса, и позволить этому методу выполнить его специализированные функции. Причем реализация этих специализированных функций у каждого документа своя.

В двух словах полиморфизм – это различная реализация однотипных действий через единый интерфейс, при условии, что данный интерфейс наследуется всеми видами реализации.

В программировании полиморфизм используется для того, чтобы сделать приложения более модульными и расширяемыми. Вместо беспорядочных условных предложений, описывающих различные направления действия, вы создаете взаимозаменяемые объекты, которые подбираете согласно своим нуждам. Это основная задача полиморфизма.

Приведу наглядный пример. Все садовые деревья плодоносят, независимо от сорта дерева. Отсюда вытекает, что единым интерфейсом является объект «дерево» с методом «созревание плодов». А вот как, и каким способом созревает плод, является индивидуальной реализацией каждого сорта отдельно. Перенесем выше сказанное на программный язык.

Создадим класс GardenTree, в котором реализуем только один метод «maturation»:

package my.polimorfism;

public class GardenTree {
    public void maturation() {
        System.out.println("Parent class: maturation.");
    }
}

Далее создадим два класса наследующих класс GardenTree, и переопределяющих метод maturation родительского класса:

package my.polimorfism;

public class Apple extends GardenTree {
    public void maturation() {
        System.out.println("Maturation apple.");
    }
}

package my.polimorfism;

public class Cherry extends GardenTree {
    public void maturation() {
        System.out.println("Maturation cherry.");
    }
}

Ну и собственно создаем класс, в котором реализуется идеология полиморфизма:

package my.polimorfism;

public class App {
    public static void ripening_fruit(GardenTree i) {
        i.maturation();
    }

    public static void main( String[] args ) {
        GardenTree apple = new Apple();
        GardenTree cherry = new Cherry();

        ripening_fruit(apple);
        ripening_fruit(cherry);
    }
}

Вопрос 1

Назовите преимущества такого подхода.

Last updated