Если вы умеете водить 4-дверный пригородный автомобиль, вы также можете водить пикап. Если вы управляли автомобилем с двигателем внутреннего сгорания, вы также можете водить электромобиль.

Форма и размер пассажирских транспортных средств могут отличаться от одного к другому. Двигатель, которым управляют эти машины, тоже может быть совершенно другим. Но для водителя это не имеет значения.

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

Полиморфизм: разрушение

Давайте посмотрим на слово полиморфизм. Вы можете разбить это на поли, превращаться, и изм.

Поли означает много, как многоугольник означает много углов. При использовании в качестве существительного превращаться это вариант вида. И изм может означать систему.

Таким образом, полиморфизм означает просто систему множества вариаций. Тем не менее, это мало что говорит вам о том, как он используется в программировании. Это дальше.

Если он ходит как утка... Почему полиморфные объекты прекрасны

instagram viewer

Когда вы создаете в своем коде класс, который наследуется от другого класса, вы привязываете новый класс к контракту. В контракте указано, что каждая переменная и функция в родительском элементе также будет в дочернем.

У каждого автомобиля есть рулевое колесо, педали газа и тормоза, а также указатель поворота. Чтобы водить машину, не нужно открывать капот. Важно только то, что это машина.

То же самое относится к классам, которые наследуются от других классов. Вот пример на TypeScript:


class Vehicle {
частный _engine: строка;
частные _tires: число;
конструктор (двигатель: строка = "сгорание", шины: число = 4) {
this._engine = двигатель;
this._tires = шины;
}
ускорять (скорость: число) {
console.log («ускорение со скоростью» + скорость);
}
тормоз (давление: число) {
console.log («приложение» + давление + «давление»);
}
Поверните налево() {
console.log («поворот налево»);
}
Поверните направо() {
console.log («поворот направо»);
}
}
class Car extends Vehicle {
}
class Tesla расширяет Car {
constructor () {
супер («электрический»);
}
}

В этом примере есть Транспортное средство учебный класс. В Машина класс наследуется от Транспортное средство учебный класс. И Тесла наследуется от Машина. Теперь создадим пару объектов и посмотрим на них.

let myCoupe: Car = new Vehicle ();
console.log (myCoupe);
console.log (myCoupe.constructor.name);
let mySedan: Vehicle = новый Tesla ();
console.log (mySedan);
console.log (mySedan.constructor.name);
myCoupe.turnLeft ();
mySedan.turnLeft ();

Вы видите, что мы заявили myCoupe быть Машина и мой седан быть Транспортное средство. Затем мы создали myCoupe как новый Транспортное средство и мой седан как новый Тесла. если ты посетите песочницу TypeScript и запустите код, вы увидите, что он работает без ошибок. И ведет себя так, как и следовало ожидать, в соответствии с контрактом.

Другими словами, все автомобили могут повернуть налево, потому что они унаследовали это от Транспортное средство учебный класс. Компилятор знает, что каждый дочерний элемент Транспортное средство согласился на договор. Таким образом, предполагается, что все в порядке, независимо от того, в каких классах были типизированы объекты или созданы их экземпляры.

Иногда это называют «утиным набором текста». Компилятор предполагает, что если он ходит как утка и разговаривает как утка, то с таким же успехом он может быть уткой. Таким образом, компилятор не заботится о деталях и просто обращается с объектом как с уткой.

Полиморфизм делает ваш код пуленепробиваемым

Еще одно преимущество контракта полиморфизма - гарантия того, что ваш код будет работать. Если вы строго типизировали все свои переменные и то, что возвращает каждая функция, вы знаете, что каждый дочерний элемент всегда будет соответствовать переменным, функциям и типам.

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

Код внутри функции может не выдавать правильные результаты. Но это проблема другого рода. Пока функция следует контракту и возвращает ожидаемый тип переменной, это не приведет к нарушению кода.

Полиморфизм огромен, и вот еще 10 принципов программирования, которые вам следует знать.

Практика полиморфизма

  • Используйте ссылку на песочницу выше, чтобы создать Лодка учебный класс.
  • Создайте экземпляр нового объекта лодки таким образом, чтобы он Транспортное средство типа, но все равно похож на лодку.
  • Убедитесь, что лодка по-прежнему ведет себя как транспортное средство.

Последний пример полиморфизма

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

Представьте, что вы создаете веб-приложение, которое подключается к базе данных MySQL. Затем босс решает перейти на базу данных PostgreSQL. Означает ли это, что вам нужно переписать все обращения к базе данных?

Нет, это не так. Если ваше приложение использует Доступ к данным класс с подклассами, которые фактически возятся с данными, вам повезло. В Доступ к данным Класс определяет, как ваше приложение взаимодействует с данными, а не то, как оно взаимодействует с базой данных.

У вас есть подклассы вроде MySQLAccess и PostgresQLAccess которые делают всю грязную работу. Но если в вашем приложении есть только Доступ к данным объекты, вы можете заменять базы данных, не переписывая ни единой строчки кода приложения.

ДелитьсяТвитнутьЭлектронное письмо
Как организовать объектно-ориентированный код с наследованием

Правильное освоение объектно-ориентированного программирования означает, что вам нужно знать о наследовании и о том, как оно может упростить кодирование и уменьшить количество ошибок.

Читать далее

Похожие темы
  • Программирование
  • Программирование
  • Объектно-ориентированное программирование
Об авторе
Ли Натан (Опубликовано 19 статей)

Ли - постоянный кочевник и эрудит со многими увлечениями и интересами. Некоторые из этих страстей вращаются вокруг продуктивности, личного развития и письма.

Ещё от Lee Nathan

Подписывайтесь на нашу новостную рассылку

Подпишитесь на нашу рассылку, чтобы получать технические советы, обзоры, бесплатные электронные книги и эксклюзивные предложения!

Нажмите здесь, чтобы подписаться