Что такое полиморфизм подтипов в ООП

Ответ

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

Это возможно благодаря тому, что дочерний класс наследует интерфейс родительского, но может предоставлять собственную реализацию его методов. В основе этого лежит принцип подстановки Барбары Лисков (Liskov Substitution Principle, LSP).

Зачем это нужно?

Полиморфизм подтипов позволяет писать более гибкий и обобщенный код. Вы можете создать функцию, которая работает с базовым типом Animal, и она будет корректно работать с любыми его подтипами (Dog, Cat, Bird), не зная об их специфической реализации.

Пример на Python

from abc import ABC, abstractmethod

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

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

    def area(self) -> float:
        return self.width * self.height

class Circle(Shape):
    def __init__(self, radius: float):
        self.radius = radius

    def area(self) -> float:
        return 3.14159 * self.radius ** 2

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

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

# Используем их в функции, ожидающей базовый тип Shape
print_area(rect)    # Выведет: Площадь фигуры: 50.0
print_area(circle)  # Выведет: Площадь фигуры: 153.93791