Концепции ООП для начинающих: объяснение полиморфизма

Опубликовано: 2021-12-10

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

ООП состоит из четырех основных строительных блоков: полиморфизма, инкапсуляции, абстракции и наследования. Поскольку объем нашей статьи ограничен полиморфизмом в ООП, мы подробно обсудим полиморфизм, включая примеры полиморфизма в Java и полиморфизма в Python.

Изучайте онлайн-курсы по программному обеспечению от лучших университетов мира. Участвуйте в программах Executive PG, Advanced Certificate Programs или Master Programs, чтобы ускорить свою карьеру.

Оглавление

Определение полиморфизма

Простейшим определением полиморфизма было бы то, что полиморфизм означает существование в различных формах. Оно происходит от двух греческих терминов: «поли», что означает «многочисленные», и «морф», что переводится как «формы».

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

Полиморфизм — одна из наиболее важных особенностей ООП. В Java и Python переменные, объекты и функции могут существовать во многих формах. В полиморфизме подкласс или метод определяет свои атрибуты и поведение, сохраняя при этом некоторые функциональные возможности своего родительского класса. Это подводит нас к наследованию, позволяющему создавать иерархии классов, в которых базовый класс передает свои атрибуты и поведение производному классу. Впоследствии функциональные возможности производного класса могут быть свободно изменены или расширены по мере необходимости. С этой целью полиморфизм гарантирует выполнение правильного метода в зависимости от типа вызывающего объекта.

Для наглядности предположим, что у вас есть класс, отображающий дату и время. Теперь вы создаете метод, который наследует класс и отображает сообщение «Привет!» вместе с датой и временем.

Пример полиморфизма в Java

Рассмотрим суперкласс «Фигуры», который имеет метод «область ()». Подклассы в разделе «Форма» могут быть «Прямоугольник», «Окружность», «Треугольник» и т. д., и каждый подкласс имеет свой метод вычисления площади. Применяя концепции наследования и полиморфизма, подклассы используют метод «площадь()», чтобы найти формулу для вычисления площади соответствующей фигуры.

формы класса {

общественная пустая область () {

System.out.println("Формула площади");

}

}

класс Треугольник расширяет формы {

общественная пустая область () {

System.out.println("Треугольник равен 1/2 * основание * высота");

}

}

класс Circle расширяет формы {

общественная пустая область () {

System.out.println («Круг равен 3,14 * радиус * радиус»);

}

}

основной класс {

public static void main(String[] args) {

Фигуры myShape = новые фигуры(); // Создаем объект Shapes

Формы myTriangle = новый треугольник(); // Создаем объект Треугольник

Фигуры myCircle = новый круг(); // Создаем объект Круг

myShape.область();

мойТреугольник.площадь();

myShape.область();

мойкруг.область();

}

}

Вывод приведенного выше программного кода будет следующим:

Формула площади треугольника: 1/2*основание*высота.

Формула площади круга: 3,14 * радиус * радиус.

Типы полиморфизма в ООП

Полиморфизм в ООП бывает двух типов — статический (полиморфизм времени компиляции) и динамический (полиморфизм времени выполнения).

1. Статический полиморфизм

В Java перегрузка методов является наиболее распространенным типом статического полиморфизма. Он может создать несколько методов с одним и тем же именем в одном классе, но с разными параметрами. Наборы параметров должны отличаться хотя бы по одному из следующих трех критериев:

  • Методы должны иметь разное количество параметров.
  • Типы параметров должны быть разными. Например, если один метод принимает Long, другой принимает String.
  • Методы должны принимать параметры в разном порядке. Например, если метод 1 принимает Long и String, второй метод должен принимать String, а затем Long.

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

Ниже приведен пример кода Java, демонстрирующий полиморфизм времени компиляции. В этом примере метод add() перегружен двумя разными типами параметров.

пакет staticPolymorphism;

публичный класс Дополнение

{

пустая сумма (int x, int y)

{

интервал с = х+у;

System.out.println(" Сложение двух чисел:" +c); }

пустая сумма (int x, int y, int z)

{

интервал с = х+у+г;

System.out.println(" Сложение трех чисел:" +c); }

public static void main (аргументы String [])

{

Дополнение obj = новое Дополнение();

обж.сумма ( 45,34);

obj.sum(60, 32, 11);

}

}

Вывод вышеуказанной программы будет:

Сложение двух чисел:79

Добавление трех чисел: 103

2. Динамический полиморфизм

Динамический полиморфизм или полиморфизм времени выполнения достигается за счет переопределения методов. Здесь методы находятся в разных формах в разных классах (переопределение метода), и вместо времени компиляции вызов переопределенного метода разрешается во время выполнения. Теперь, после присвоения объекта ссылке на класс и вызова метода, выполняется метод в классе объекта. Поскольку объект создается во время выполнения, форма метода (в объекте), который должен быть выполнен, определяется только во время выполнения.

Ниже приведен пример кода Java, демонстрирующий полиморфизм времени выполнения . В примере есть суперкласс «Животное» и три подкласса: «кенгуру», «тигр» и «рыба». Подклассы расширяют суперкласс и переопределяют его метод «move()». Метод «move()» вызывается ссылочной переменной родительского класса «Animal».

класс животных {

недействительный ход () {

System.out.println("Животные двигаются");

}

}

класс кенгуру расширяет Animal{

недействительный ход () {

System.out.println("Кенгуру прыгают");

}

}

класс тигр расширяет Animal{

недействительный ход () {

System.out.println("Тигры идут");

}

}

класс рыба расширяет Animal{

недействительный ход () {

System.out.println("Рыбки плавают");

}

}

основной класс {

public static void main (String args []) {

Животное A = новое животное();

Животное k = новый кенгуру(); // повышение приведения

Животное t = новый тигр(); // повышение приведения

Животное f = новая рыба(); // повышение приведения

Движение();

к. двигаться();

t.переместить();

е. двигаться();

}

}

Вывод вышеуказанной программы будет:

Животные двигаются

Кенгуру прыгают

Тигры идут

Рыба плавает

Полиморфизм в Python

Полиморфизм в Python бывает трех типов: полиморфизм операторов, полиморфизм функций и полиморфизм классов. Python также допускает переопределение методов, но не перегрузку методов.

1. Полиморфизм операторов

В Python оператор «+» имеет двойное назначение. Он используется для арифметических операций сложения в случае целочисленных типов данных, а для строк оператор «+» выполняет конкатенацию.

Ниже приведен пример кода Python, в котором оператор «+» выполняет сложение целочисленных типов данных:

число1 = 4

число2 = 5

печать (число1+число2)

Вывод приведенного выше программного кода равен «9».

Ниже приведен пример кода Python, в котором оператор «+» выполняет конкатенацию строковых типов данных:

str1 = «Хорошо»

str2 = «Вечер»

печать(str1+” “+str2)

Вывод вышеуказанной программы будет «Добрый вечер».

2. Полиморфизм функций

Функция len() в Python совместима с различными типами данных, такими как список, строка, кортеж, словарь и набор, но возвращает определенную информацию для каждого типа данных. Вот пример:

print(len("Программист"))

print(len(["Python", "Java", "C"]))

print(len({"Имя": "Кэти", "Адрес": "Техас"}))

Вышеупомянутая программа будет иметь следующий вывод:

9

3

2

3. Полиморфизм классов

Расширяя концепцию полиморфизма, Python позволяет нескольким классам иметь методы с одинаковыми именами. Ниже приведен пример, показывающий полиморфизм в методах класса в Python. В примере есть два класса: «Кошка» и «Собака». У них схожая структура и одинаковые имена методов make_sound() и info().

класс Кот:

def __init__(я, имя, возраст):

self.name = имя

возраст = возраст

информация о защите (я):

print(f"Я кошка. Меня зовут {self.name}. Мне {self.age} лет.")

определение make_sound (я):

распечатать("Мяу")

класс Собака:

def __init__(я, имя, возраст):

self.name = имя

возраст = возраст

информация о защите (я):

print(f"Я собака. Меня зовут {self.name}. Мне {self.age} лет.")

определение make_sound (я):

печать("Кора")

cat1 = Кошка («Минни», 3)

dog1 = Собака («Том», 6)

для животного в (cat1, dog1):

животное.make_sound()

животное.информация()

животное.make_sound()

Вывод будет следующим:

мяу

Я кот. Меня зовут Минни. Мне 3 года.

мяу

Лаять

Я собака. Меня зовут Том. Мне 6 лет.

Лаять

4. Переопределение метода

Python также позволяет дочерним классам наследовать атрибуты и методы родительского класса. Некоторые методы и атрибуты можно переопределить, чтобы они соответствовали дочернему классу (переопределение метода). Затем полиморфизм позволяет получить доступ к переопределенным методам и атрибутам с тем же именем, что и у родительского класса.

Ниже приведен пример кода Python, иллюстрирующий переопределение метода:

из математического импорта пи

Форма класса:

def __init__(я, имя):

self.name = имя

область защиты (я):

проходить

деф факт(я):

return «Я закрытая фигура».

защита __str__(я):

вернуть себя.имя

Класс Квадрат (Форма):

def __init__(я, длина):

super().__init__("Квадрат")

собственная длина = длина

область защиты (я):

вернуть self.length**2

деф факт(я):

return «Каждый угол в квадрате равен 90 градусам».

класс Круг (Форма):

def __init__(я, радиус):

super().__init__("Круг")

self.radius = радиус

область защиты (я):

вернуть pi*self.radius**2

а = квадрат (4)

б = круг(7)

печать (б)

печать (b.fact())

печать (a.fact())

печать (б. область ())

Вышеупомянутая программа будет иметь следующий вывод:

Круг

Я закрытая фигура.

Каждый угол в квадрате равен 90 градусам.

153.93804002589985

Узнайте больше о переопределении методов.

Преимущества полиморфизма в ООП

Полиморфизм в ООП имеет три существенных преимущества. Они следующие:

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

Путь вперед

upGrad в партнерстве с престижным Ливерпульским университетом Джона Мура предлагает строгую онлайн -программу магистра наук в области науки о данных. для работающих профессионалов, стремящихся сделать карьеру в науке о данных. Курс заканчивается получением степени магистра LJMU и сертификацией программы Executive PG от IIIT Bangalore.

Основные моменты программы:

  • 500+ часов контента, 60+ кейсов и проектов, 20+ живых сессий
  • Полный охват более 14 инструментов и программного обеспечения, таких как Python, AWS, MySQL и др.
  • Коуч-сессии с экспертами отрасли
  • Взаимное обучение и отраслевые сети
  • 360-градусная помощь в карьере

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

Изучайте онлайн-курсы по науке о данных в лучших университетах мира. Участвуйте в программах Executive PG, Advanced Certificate Programs или Master Programs, чтобы ускорить свою карьеру.

Почему полиморфизм используется в ООП?

В ООП полиморфизм — это метод, выполняющий различные задачи в зависимости от вызывающего его класса объекта. Таким образом, сообщение отправляется объектам нескольких классов, и каждый объект отвечает в соответствии со свойствами класса.

Что такое перегрузка методов в Java?

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

В чем разница между перегрузкой и переопределением?

Когда два или более метода в одном классе имеют разные параметры, но одно и то же имя, это называется перегрузкой. С другой стороны, переопределение — это когда суперкласс и дочерний класс имеют одинаковую сигнатуру метода (имя и параметры).