Приведи пример полиморфизма
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Пример полиморфизма в объектно-ориентированном программировании
Полиморфизм — это один из фундаментальных принципов ООП, который позволяет объектам с одинаковым интерфейсом выполнять различные действия. На практике это означает возможность использовать один и тот же метод для работы с разными типами данных, при этом поведение метода будет специфичным для каждого типа.
Концептуальная основа
Полиморфизм позволяет:
- Единообразно работать с объектами разных классов через общий интерфейс
- Упрощать код, уменьшая количество условных конструкций
- Легко расширять систему, добавляя новые типы без изменения существующего кода
Практический пример: геометрические фигуры
Рассмотрим классический пример с геометрическими фигурами, где каждая фигура должна уметь вычислять свою площадь, но формула расчёта отличается.
from abc import ABC, abstractmethod
import math
# Абстрактный базовый класс (интерфейс)
class Shape(ABC):
@abstractmethod
def calculate_area(self):
"""Абстрактный метод для вычисления площади"""
pass
@abstractmethod
def get_name(self):
"""Абстрактный метод для получения имени фигуры"""
pass
# Конкретная реализация для круга
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def calculate_area(self):
return math.pi * self.radius ** 2
def get_name(self):
return "Круг"
# Конкретная реализация для прямоугольника
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def calculate_area(self):
return self.width * self.height
def get_name(self):
return "Прямоугольник"
# Конкретная реализация для треугольника
class Triangle(Shape):
def __init__(self, base, height):
self.base = base
self.height = height
def calculate_area(self):
return 0.5 * self.base * self.height
def get_name(self):
return "Треугольник"
# Функция, демонстрирующая полиморфизм
def process_shapes(shapes):
"""Обрабатывает коллекцию фигур полиморфным способом"""
total_area = 0
for shape in shapes:
# Полиморфный вызов: один интерфейс, разное поведение
area = shape.calculate_area()
name = shape.get_name()
total_area += area
print(f"{name}: площадь = {area:.2f}")
print(f"\nОбщая площадь всех фигур: {total_area:.2f}")
return total_area
# Использование
def main():
# Создаём коллекцию разных фигур
shapes = [
Circle(5),
Rectangle(4, 6),
Triangle(3, 8),
Circle(2.5)
]
# Обрабатываем фигуры полиморфно
process_shapes(shapes)
if __name__ == "__main__":
main()
Ключевые аспекты реализации:
- Абстрактный базовый класс
Shapeопределяет общий интерфейс - Конкретные классы (
Circle,Rectangle,Triangle) реализуют специфичное поведение - Функция
process_shapesработает с абстракцией, не зная конкретных типов
Преимущества такого подхода:
- Расширяемость: можно легко добавить новую фигуру (например,
Square), не изменяя код функцииprocess_shapes - Поддерживаемость: логика обработки централизована в одном месте
- Тестируемость: каждый класс можно тестировать независимо
Реальный пример из тестирования:
В контексте QA автоматизации полиморфизм часто используется для создания Page Object Model:
// Базовый класс для всех страниц
public abstract class BasePage {
protected WebDriver driver;
public BasePage(WebDriver driver) {
this.driver = driver;
}
// Абстрактный метод, который должен быть реализован в каждой странице
public abstract boolean isPageLoaded();
// Общий метод для всех страниц
public void takeScreenshot(String testName) {
// реализация скриншота
}
}
// Конкретные страницы
public class LoginPage extends BasePage {
public boolean isPageLoaded() {
return driver.findElement(By.id("login-button")).isDisplayed();
}
public void login(String username, String password) {
// специфичная логика входа
}
}
public class DashboardPage extends BasePage {
public boolean isPageLoaded() {
return driver.findElement(By.className("user-profile")).isDisplayed();
}
public String getWelcomeMessage() {
// специфичная логика получения сообщения
}
}
// Полиморфное использование в тестах
public class TestBase {
public void verifyPage(BasePage page) {
// Единый способ проверки загрузки любой страницы
assertTrue(page.isPageLoaded());
page.takeScreenshot("page_verification");
}
}
Полиморфизм в тестировании позволяет создавать гибкие и поддерживаемые тестовые фреймворки, где можно единообразно работать с разными типами страниц, элементами интерфейса или API-ответами, значительно уменьшая дублирование кода и упрощая его поддержку.