УПРОЩЕННОЕ ЗАЯВЛЕНИЕ О ПОЛИМОРФИЗМЕ
Почему и когда использовать полиморфизм?
Объектно-ориентированное программирование или сокращенно ООП является неотъемлемой частью современной архитектуры приложений. ООП включает четыре фундаментальных понятия: ПИРОГ: абстракция, полиморфизм, наследование и инкапсуляция.
Полиморфизм состоит из двух частей: поли (множественный) и морф (форма). Согласно Wikipedia.com, полиморфизм описывается следующим образом:
В языках программирования и теории типов полиморфизм - это предоставление единого интерфейса для сущностей разных типов или использование одного символа для представления нескольких различных типов.
Чтобы было проще:
В мире ООП и объектов каждый отдельный объект, который имеет более одной формы или может быть назначен более чем одному классу, называется полиморфным объектом.
Как инструктор по Java, я постоянно сталкиваюсь с различными вопросами, такими как «что такое полиморфизм?» или «зачем нам вообще это нужно?».
Поскольку понимание полиморфизма необходимо для понимания идеи объектно-ориентированного программирования, я решил написать эту статью. На самом деле, что заставило меня написать на эту тему, был вопрос, который однажды мне задал один из моих студентов:
Привет, Хатеф !! Зачем нужен полиморфизм? Какой в этом смысл?
Остальная часть этой статьи - это строки, которые я написал, чтобы описать, почему и когда использовать полиморфизм.
Основная идея полиморфизма - придать гибкость. Как? Я опишу это на примере Автосервиса:
Представим, что вы опытный автомеханик в сервисной мастерской, которая может отремонтировать любую машину B-класса. Если вы поместите эту концепцию в формат ООП, вам нужно будет создать класс под названием Technician, как показано ниже:
class Technician{ private String name; private Car car public Technician(String name){ this.name = name; } /* ... getters and setters */ public void repair(Car theCar){ // ... the body of repair method } }
Все идет нормально. Мы создали наш класс Technician с одним методом repair()
, который принимает любой объект типа Car
.
Дело здесь:
Директор магазина знает, что вы можете отремонтировать любую машину B-класса. Таким образом, если какой-либо покупатель с указанными ниже моделями автомобилей придет в магазин и попросит о ремонте, менеджер уверен, что вы сможете его успешно отремонтировать.
В терминах ООП менеджер может позвонить вам (создать экземпляр Technician
объекта) и попросить отремонтировать автомобиль (вызвать вас repair()
методом). Но подождите, какой тип автомобиля менеджер собирается передать в качестве theCar
аргумента?
Как техник, вас это не беспокоит. Потому что вы можете отремонтировать любую машину B-класса. В результате все приведенные ниже коды верны и имеют смысл:
Technician hatef = new Technician("Hatef"); // create several Car instances Car yaris = new Toyota(); Car focus = new Ford(); Car azera = new Hyundai(); Renault megane = new Renault(); // create manager object Manager manager = new Manager(); // now manager calls the technician to start repairing hatef.repair(yaris); // hatef is able to repair any Car instances hatef.repair(focus); // focus is a Car instance hatef.repair(azera); // azera is a Car instance // now, watch below code, it is wrong because of polymorphism violation. megane is not an object of Car class. hatef.repair(megane);
Но подождите, почему это так? почему код в последней строке неправильный?
Ответ:
Из-за полиморфизма объекты, такие как yaris
, focus
, azera
, являются ссылочными переменными типа Car
, которые указывают на объект другого типа. yaris
указывает на Toyota
. focus
указывает на Ford
, а azera
указывает на Hyundai
.
НО : megane
- это ссылочная переменная типа Renault
, которая указывает на объект Renault
, поэтому неправильно говорить: megane
это car
!!!!
Итак, суть в том, что, если вы заметили, мы смогли обработать несколько объектов разного типа в одну Car
ссылочную переменную. Таким образом, кодирование метода repair()
стало для нас очень простым. Нам просто нужно было сказать public void repair(Car theCar){....}
.
Считайте, что у нас не было полиморфизма. Как вы могли написать метод
repair
в его простейшей форме ??
Без полиморфизма вам нужно переписать метод Technician repair()
, как показано ниже:
public void repair(Toyota theCar){....} // an overloaded repair public void repair(Ford anotherCar){...} //another overloaded repair public void repair(Hyundai anotherCar){...}
Ты заметил? Вместо простой строчки кода мне нужно написать кучу перегруженных методов.
В этом магия ПОЛИМОРФИЗМА
Теперь позвольте мне добавить сюда еще несколько концепций:
Просто подумайте о ситуации, когда вы закончили писать код и создали приложение. Настал день, когда вы должны предоставить продукт клиенту. Вдруг к вам подходит покупатель и говорит:
Привет, Хатеф! Знаете ли вы, что мы только что открыли наш новый сервисный отдел? Сейчас мы обслуживаем тяжелые автомобили, такие как автобусы и тракторы: D
Упс !! Я не могу в это поверить. Я не учел это изменение требований заказчика. Мой код может восстанавливать только Ford
, Toyota
и Hyundai
.
Итак, попробуйте обнять Полиморфизм. Постарайтесь полюбить его и использовать в своих повседневных задачах по кодированию. В противном случае вам придется каждый раз заново изобретать колесо.
Дополнительную информацию можно найти в этой замечательной публикации Шаники Эдиривиры: