Точка входа в программирование
21.4K subscribers
905 photos
163 videos
1 file
2.45K links
Фундаментальные знания по основам программирования

Разместить рекламу: @tproger_sales_bot

Правила общения: https://tprg.ru/rules

Другие каналы: @tproger_channels

Сайт: https://tprg.ru/site

Регистрация в перечне РКН: https://tprg.ru/zrgj
Download Telegram
Простыми словами: Полиморфизм в ООП

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

Давайте же разберём подробно концепцию полиморфизма в объектно-ориентированном программировании (ООП) с примерами кода.

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

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

1. Унификация интерфейсов позволяет использовать один интерфейс для взаимодействия с различными типами объектов.
2. Гибкость и расширяемость упрощает добавление нового функционала, так как новые классы могут использовать существующие интерфейсы.
3. Упрощение кода позволяет писать более общий и универсальный код.

Как это выглядит в коде?

В Python полиморфизм часто достигается через методические перегрузки и наследование:
class Животное:
def издать_звук(self):
raise NotImplementedError("Этот метод должен быть реализован в подклассе")

class Кот(Животное):
def издать_звук(self):
print("Мяу!")

class Собака(Животное):
def издать_звук(self):
print("Гав!")

животные = [Кот(), Собака()]

for животное in животные:
животное.издать_звук() # Output: Мяу! Гав!


В этом примере метод издать_звук вызывается для объектов различных классов (Кот и Собака), и каждый объект реализует этот метод по-своему.

В Java полиморфизм достигается через интерфейсы и абстрактные классы:
abstract class Животное {
abstract void издатьЗвук();
}

class Кот extends Животное {
@Override
void издатьЗвук() {
System.out.println("Мяу!");
}
}

class Собака extends Животное {
@Override
void издатьЗвук() {
System.out.println("Гав!");
}
}

public class Main {
public static void main(String[] args) {
Животное[] животные = { new Кот(), new Собака() };

for (Животное животное : животные) {
животное.издатьЗвук(); // Output: Мяу! Гав!
}
}
}


Здесь абстрактный метод издатьЗвук реализуется в классах Кот и Собака, и тот же метод вызывает различные реализации в зависимости от объекта.

Давайте теперь посмотрим примеры кейсов, где может быть актуален полиморфизм:

1. Фигуры

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

class Фигура:
def площадь(self):
raise NotImplementedError("Этот метод должен быть реализован в подклассе")

class Круг(Фигура):
def __init__(self, радиус):
self.радиус = радиус

def площадь(self):
return 3.14159 * self.радиус ** 2

class Прямоугольник(Фигура):
def __init__(self, ширина, высота):
self.ширина = ширина
self.высота = высота

def площадь(self):
return self.ширина * self.высота

фигуры = [Круг(5), Прямоугольник(3, 4)]

for фигура in фигуры:
print(f"Площадь: {фигура.площадь()}")


2. Платежные системы

Используем полиморфизм для различных способов проведения платежей.

class Платеж(ABC):
@abstractmethod
def провести_платеж(self, сумма):
pass

class КредитнаяКарта(Платеж):
def провести_платеж(self, сумма):
print(f"Платеж проведён на сумму {сумма} с кредитной карты")

class PayPal(Платеж):
def провести_платеж(self, сумма):
print(f"Платеж проведён на сумму {сумма} через PayPal")

платежи = [КредитнаяКарта(), PayPal()]
for платеж in платежи:
платеж.провести_платеж(100)


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

#простымисловами #ооп #полиморфизм