Ответ
Полиморфизм — это принцип ООП, позволяющий объектам разных классов обрабатываться как объекты общего родительского класса, при этом конкретное поведение (вызываемый метод) определяется реальным типом объекта во время выполнения.
Суть: «Один интерфейс — множество реализаций». Код может работать с абстракцией, не зная конкретного типа объекта.
Основные типы полиморфизма:
- Полиморфизм подтипов (на основе наследования): Самый распространённый вид.
- Параметрический полиморфизм (дженерики/шаблоны): Код, работающий с разными типами данных.
Пример на 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, автоматически начнут с ней работать. Связанность кода падает, а расширяемость растёт. Красота, ёперный театр!