Полиморфизм

Полиморфизм

Полиморфизм – это возможность динамического изменения объектов во время выполнения. Например, человек с кем-то ругается – мы говорим, что он «злой»; с кем-то смеётся – мы говорим, что он «веселый». На работе человек приводится к типу «сотрудник», этот же человек на пешеходном переходе приводится к типу «пешеход», в кругу семьи он приводится к типу «отец» и т.д. Т.е. изменение поведения объекта в зависимости от обстоятельств.


interface Funny {

    void beGlad();
}


interface Employee {

    void doWork();
}


interface Pedestrian {

    void crossRoad();
}


class Person implements Funny, Employee, Pedestrian {

    private String name;
    private String lastName;

    Person(String name, String lastName) {
        this.name = name;
        this.lastName = lastName;
    }

    public void getName() {
        System.out.println("My name is " + lastName
                + ". " + name + " " + lastName);
    }

    @Override
    public void beGlad() {
        System.out.println("I'm happy!");
    }

    @Override
    public void doWork() {
        System.out.println("I'm busy. Please, call me back later.");
    }

    @Override
    public void crossRoad() {
        System.out.println("Why, why, why\nWas the traffic light green?");
    }
}


Person jon = new Person("Jon", "Smith");
jon.getName(); // My name is Smith. Jon Smith

Funny jonFunny = (Funny)jon;
jonFunny.beGlad(); // I'm happy!

Pedestrian jonPedestrian = (Pedestrian)jon;
jonPedestrian.crossRoad(); // Why, why, why
                          // Was the traffic light green?
В Java есть два вида полиморфизма: статический и динамический. Статический полиморфизм - перегрузка методов. Определяется на стадии компиляции. Т.е. компилятор знает какой именно метод будет вызван.


class Rubbit {}

class Hunter {}

class Fox {
    void run(Rubbit rubbit) {
        // сократить дистанцию
    }
    void run(Hunter hunter) {
        // увеличить дистанцию
    }
}
В этом примере поведение лисы зависит от того, с каким аргументом был вызван её метод run(). Если туда передан кролик, то лиса начинает его догонять. Если охотник - лисе нужно убегать. Т.о. статический полиморфизм - поведение объекта в зависимости от контекста.

Динамический полиморфизм - способность объектов, имеющих общего родителя, решать одни и те же задачи разными способами. Например, отец всю жизнь ищет свои носки. И сын ищет свои носки, но сын для этого приобщает еще и свою жену. Задача одна и та же, способы разные. Динамический полиморфизм - переопределение методов родительского класса. Определяется на стадии выполнения. Компилятор не знает, какая именно реализация метода будет вызвана.


class Father {
    void findMySocks() {
        // заглянуть под диван, под матрас, в корзину с грязным бельём
    }
}

class Son extends Father {
    @Override
    void findMySocks() {
        // сказать жене, чтобы нашла носки
    }
}
ООП РАЗМЫШЛЕНИЯ