#15 – Полиморфизм в ООП

#15 – Полиморфизм в ООП

Полиморфизм является одним из ключевых понятий в ООП. При помощи полиморфизма мы можем выполнить переопределение родительского метода в классах наследниках. За урок мы научимся использовать полиморфизм на практике.

Видеоурок

Полиморфизм является одной из концепций объектно ориентированного программирования. Благодаря полиморфизму мы можем переопределять методы родительского класса в классах наследниках.


Зачем нужен полиморфизм?

Предположим что у нас есть один большой класс «Транспорт». В нём прописаны методы:

  • вывод всей информации;
  • установка полей класса;
  • запуск двигателя (на данный момент выводит лишь текст про запуск двигателя).


На основе класса мы создаем два класса наследника: «Car» и «Airplane». В каждом из классов-наследников мы будем иметь доступ ко всем методам из класса «Транспорт».


Мы явно понимаем, что метод «запуск двигателя» должен иметь разную реализацию у двух классов. Как мы можем заменить методы:

  1. Можем создать в каждом классе новые методы, что будут релевантны конкретному классу. Из минусов то, что каждый метод будет иметь новое название и нам сложно будет запомнить все названия методов для всех классов;
  2. Можем создать переопределение методов. Для этого необходимо прописать такое же имя как в главном классе и далее прописать новое содержимое для метода. Получается явный плюс, так как теперь повсюду используется одно имя и в зависимости от разных классов будет вызываться разный метод, но под одним и тем же именем.


В ООП вы можете переопределять неограниченное количество методов и указывать для них новые свойства и действия.

Исходный код

Весь код будет доступен после подписки на проект!

Задание к уроку

Необходимо оформить подписку на проект, чтобы получить доступ ко всем домашним заданиям

Большое задание по курсу

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

Также стоит посмотреть

Курс по NestJS с нуля / Разработка веб проектов
9 уроков
Java 3D Game / Разработка игры Minecraft
5 уроков
Изучение JavaScript для начинающих!
15 уроков
Уроки Node JS и Express для начинающих
13 уроков
Уроки Angular для начинающих
11 уроков
Разработка игр на Java для начинающих
7 уроков
Комментарии (3)
Добавить комментарий

Rzevsky 02 апреля 2024 в 09:37


public class Main {
    public static void main(String[] args) {
        Animal unknownAnimal = new Animal("Чебухрюк");
        Cow cow1 = new Cow("Буренка");
        Cat cat1 = new Cat("Мурзик");
        Frog frog1 = new Frog("Квакушка");

        System.out.println(unknownAnimal.getAnswer());
        System.out.println(cow1.getAnswer());
        System.out.println(cat1.getAnswer());
        System.out.println(frog1.getAnswer());

    }
}

//***************************************************************************************

public class Animal {
    public String name;

    public Animal(String name) {
        setFields(name);
    }

    public void setFields(String name) {
        this.name = name;
    }

    //Данный метод родительского класса отрабатывает за все одноименные и дочерние методы (переопределенные).
    //При этом, он вызывает метода says(), также переопределенного во всех подклассах.
    //Именно поэтому метод says() выполняется уникальным для каждого подкласса образом.
    public String getAnswer() {
        return name + " говорит: " + says();
    }

    public String says() {
        return "%@!&^($#_=%@$-*";
    }
}

//***************************************************************************************

public class Cow extends Animal {

    public Cow(String name) {
        super(name);
    }
    @Override
    public void setFields(String name) {
        super.setFields(name);
    }
    @Override
    public String getAnswer() {
        return super.getAnswer();
    }
    @Override
    public String says() {
        return "Мууууу!";
    }
}

//***************************************************************************************

public class Cat extends Animal {

    public Cat(String name) {
        super(name);
    }
    @Override
    public void setFields(String name) {
        super.setFields(name);
    }
    @Override
    public String getAnswer() { //метод возвращает
        return super.getAnswer();
    }
    @Override
    public String says() { //переопределенный метод
        return "Мяу!";
    }
}

//***************************************************************************************

public class Frog extends Animal {

    public Frog(String name) {
        super(name);
    }
    @Override
    public void setFields(String name) {
        super.setFields(name);
    }
    @Override
    public String getAnswer() {
        return super.getAnswer();
    }
    @Override
    public String says() {
        return "Ква-Ква!";
    }
}
Ответить

Rzevsky 02 апреля 2024 в 09:31

Мне в этом уроке не хватало более четенького фокуса на полиморфизм непосредственно. Хоть я и не самый начинающий - пришлось вникать в избыточный код с точки зрения полиморфизма. В итоге, для самопроверки, написал свой пример, попроще. В нем все 3 метода каждого дочернего класса - переопределены, обращаясь к функционалу класса родительского. Но родительский метод getAnswer() ведет себя интереснее.
Итоговый вывод в консоли:

Чебухрюк говорит: %@!&^($#_=%@$-*
Буренка говорит: Мууууу!
Мурзик говорит: Мяу!
Квакушка говорит: Ква-Ква!
Ответить

Rzevsky 02 апреля 2024 в 00:16

Я бы сформулировал так. Если вам требуется в родительском и дочерних классах применять методы с одним и тем же именем и входными/выходными параметрами. А причина этому - расширять/изменять методы дочерних классов, максимально ориентируясь на суть метода родительского.
Тогда имеет смысл дисциплинировать себя маркером @Override. Потому что можно и без него, но с ним понятнее и надежнее.
Ответить