← Назад к вопросам

Приведи пример полиморфизма

1.0 Junior🔥 122 комментариев
#Soft skills и карьера#Автоматизация тестирования

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Пример полиморфизма в объектно-ориентированном программировании

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

Концептуальная основа

Полиморфизм позволяет:

  • Единообразно работать с объектами разных классов через общий интерфейс
  • Упрощать код, уменьшая количество условных конструкций
  • Легко расширять систему, добавляя новые типы без изменения существующего кода

Практический пример: геометрические фигуры

Рассмотрим классический пример с геометрическими фигурами, где каждая фигура должна уметь вычислять свою площадь, но формула расчёта отличается.

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()

Ключевые аспекты реализации:

  1. Абстрактный базовый класс Shape определяет общий интерфейс
  2. Конкретные классы (Circle, Rectangle, Triangle) реализуют специфичное поведение
  3. Функция 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-ответами, значительно уменьшая дублирование кода и упрощая его поддержку.

Приведи пример полиморфизма | PrepBro