Что такое полиморфизм в объектно-ориентированном программировании?

Ответ

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

Суть: «Один интерфейс — множество реализаций». Код может работать с абстракцией, не зная конкретного типа объекта.

Основные типы полиморфизма:

  1. Полиморфизм подтипов (на основе наследования): Самый распространённый вид.
  2. Параметрический полиморфизм (дженерики/шаблоны): Код, работающий с разными типами данных.

Пример на Python (полиморфизм подтипов):

from abc import ABC, abstractmethod

# Абстрактный базовый класс (интерфейс)
class Shape(ABC):
    @abstractmethod
    def area(self):
        pass

# Конкретные реализации
class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height
    def area(self):
        return self.width * self.height

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius
    def area(self):
        return 3.14 * self.radius ** 2

# Функция, использующая полиморфизм
def print_area(shape: Shape):  # Принимает любой объект типа Shape
    print(f"Площадь фигуры: {shape.area()}")

# Создание объектов
rect = Rectangle(5, 10)
circle = Circle(7)

# Один вызов функции для разных типов
print_area(rect)   # Выведет: Площадь фигуры: 50
print_area(circle) # Выведет: Площадь фигуры: 153.86

Функция print_area не знает, с Rectangle или Circle она работает. Она вызывает метод area(), а конкретная реализация выбирается в рантайме на основе типа объекта.

Пример параметрического полиморфизма (дженерики в Java):

// Класс, работающий с любым типом T
public class Box<T> {
    private T content;
    public void set(T content) { this.content = content; }
    public T get() { return content; }
}

Box<String> stringBox = new Box<>();
stringBox.set("Hello");
Box<Integer> intBox = new Box<>();
intBox.set(123);
// Один класс Box, но разное поведение для String и Integer

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

Ответ 18+ 🔞

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

Представь, есть у тебя общее понятие — «фигура». Любая, блядь, фигура. Квадрат, круг, треугольник — похуй. И у всех них есть какая-то площадь, да? Ну площадь, блядь, что тут непонятного.

Так вот, полиморфизм — это когда ты можешь крикнуть любой фигуре: «Эй, сука, скажи свою площадь!», и каждая ответит по-своему. Круг посчитает через радиус, квадрат через сторону, а треугольник, ёбаный в рот, через основание и высоту. Но тебе-то, использующему этот код, похуй, как она считает! Ты просто знаешь, что у фигуры есть метод area(), и он тебе чё-то вернёт. Вот и вся магия, в рот меня чих-пых!

Смотри, как это в коде выглядит, только не засыпай, а то хуй потом разбудишь.

from abc import ABC, abstractmethod

# Вот это наша абстракция, типа общий приказ для всех.
class Shape(ABC):
    @abstractmethod
    def area(self):
        pass  # А как именно — сами догадайтесь, пидарасы!

# А вот конкретные исполнители.
class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height
    def area(self):
        return self.width * self.height  # Прямоугольник считает так.

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius
    def area(self):
        return 3.14 * self.radius ** 2  # А круг — вот так, блядь!

# И теперь главный фокус. Функция, которой похуй, что к ней пришло.
def print_area(shape: Shape):  # Она требует только, чтобы объект был типа Shape
    print(f"Площадь фигуры: {shape.area()}")  # И чтобы у него был метод area()

# Создаём наших подопытных.
rect = Rectangle(5, 10)
circle = Circle(7)

# И охуеваешь с результата.
print_area(rect)   # Выведет: Площадь фигуры: 50
print_area(circle) # Выведет: Площадь фигуры: 153.86

Видишь? Функция print_area — она как начальник, которому похуй. Ему главное — чтобы отчёт (area()) был. А как его Василий из бухгалтерии или Петрович из цеха приготовят — его не ебёт. Конкретный метод вызывается в рантайме, когда уже ясно, кто именно пришёл: прямоугольник или круг. Вот это и есть полиморфизм подтипов, ёпта!

А ещё есть, блядь, параметрический. Это когда ты пишешь один класс, но он может работать с чем угодно: со строками, числами, да хоть с мартышками. В Java, например, это дженерики.

public class Box<T> {
    private T content;
    public void set(T content) { this.content = content; }
    public T get() { return content; }
}

Box<String> stringBox = new Box<>();
stringBox.set("Hello");
Box<Integer> intBox = new Box<>();
intBox.set(123);
// Один класс Box, но разное поведение для String и Integer

Видал? Один ящик (Box), а кладёшь ты в него что хочешь. Хуй с горы положи — и тот примет. Это и есть параметрический полиморфизм, ядрёна вошь!

Итог, блядь: преимущества — овердохуища. Код становится гибким, как жопа гимнастки. Добавил новый тип фигуры — и все старые функции, которые работают с Shape, автоматически начнут с ней работать. Связанность кода падает, а расширяемость растёт. Красота, ёперный театр!