draw()
может по-разному отрисовывать объекты классов Circle
, Square
и Triangle
, при этом вызываться единообразно.
Полиморфизм - это возможность использования объектов разных классов единообразно, при условии, что эти классы имеют общий интерфейс (набор методов). Он позволяет писать код, который работает с объектами разных типов, не зная конкретный тип объекта во время выполнения. Это достигается за счет того, что все объекты предоставляют общий набор операций.
Как полиморфизм упрощает работу:
Пример на Python:
class Animal:
def make_sound(self):
raise NotImplementedError("Подкласс должен реализовать этот метод")
class Dog(Animal):
def make_sound(self):
return "Woof!"
class Cat(Animal):
def make_sound(self):
return "Meow!"
def animal_sound(animal):
return animal.make_sound()
# Создаем экземпляры разных классов
dog = Dog()
cat = Cat()
# Используем полиморфизм
print(animal_sound(dog)) # Выводит: Woof!
print(animal_sound(cat)) # Выводит: Meow!
В этом примере, `Animal` - это базовый класс (или интерфейс), а `Dog` и `Cat` - подклассы. Функция `animal_sound` принимает объект типа `Animal` (или его подкласс) и вызывает метод `make_sound`. Благодаря полиморфизму, неважно, какой конкретно класс передан в функцию `animal_sound` – она просто вызывает метод `make_sound`, который каждый класс реализует по-своему. Это позволяет написать один код, который работает с разными типами объектов. Важно отметить, что в Python, полиморфизм в основном достигается через Duck Typing: "Если выглядит как утка, плавает как утка и крякает как утка, то это, вероятно, утка". В отличие от некоторых других языков, в Python нет жесткой необходимости объявлять общий интерфейс через абстрактный класс или интерфейс, хотя это и рекомендуется для ясности и поддержки.
Другой пример с использованием абстрактного класса (ABC) из модуля `abc`:
from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def area(self):
pass
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14 * self.radius * self.radius
class Square(Shape):
def __init__(self, side):
self.side = side
def area(self):
return self.side * self.side
def print_area(shape):
print(f"Площадь: {shape.area()}")
circle = Circle(5)
square = Square(4)
print_area(circle) # Выводит: Площадь: 78.5
print_area(square) # Выводит: Площадь: 16
В этом примере `Shape` - абстрактный базовый класс (ABC), который определяет абстрактный метод `area`. Классы `Circle` и `Square` наследуются от `Shape` и реализуют метод `area`. Функция `print_area` принимает объект типа `Shape` и вызывает метод `area`, демонстрируя полиморфное поведение. Использование ABC помогает гарантировать, что все подклассы реализуют необходимые методы, делая код более надежным.