Ответ
Полиморфизм подтипов (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