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

Что такое полиморфизм?

1.2 Junior🔥 151 комментариев
#Другое

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

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

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

Полиморфизм (Polymorphism)

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

Типы полиморфизма

1. Параметрический полиморфизм (Generics) Одна функция работает с разными типами данных.

Пример Java:

public <T> void printList(List<T> list) {
  for (T item : list) {
    System.out.println(item);
  }
}

Эта функция работает с List<String>, List<Integer>, List<Object> и т.д.

2. Полиморфизм подтипов (Inheritance) Дочерний класс переопределяет методы родителя.

Пример:

class Animal {
  public void makeSound() {
    System.out.println("Some sound");
  }
}

class Dog extends Animal {
  @Override
  public void makeSound() {
    System.out.println("Woof!");
  }
}

class Cat extends Animal {
  @Override
  public void makeSound() {
    System.out.println("Meow!");
  }
}

Тогда можем использовать:

Animal dog = new Dog();
Animal cat = new Cat();

dog.makeSound();  // Output: Woof!
cat.makeSound();  // Output: Meow!

3. Операторный полиморфизм (Operator Overloading) Один оператор работает по-разному для разных типов.

Пример:

5 + 3 = 8  (сложение чисел)
"Hello" + "World" = "HelloWorld"  (конкатенация строк)

Зачем нужен полиморфизм

Гибкость кода Можем писать обобщенный код который работает с разными типами.

Переиспользование Не нужно писать разные функции для каждого типа.

Расширяемость Легко добавлять новые типы без изменения существующего кода.

Чистота кода Меньше дублирования, более читаемо.

Для QA инженера

Понимание полиморфизма помогает:

  1. Понимать код Когда читаю тесты, вижу как объекты используются полиморфно.

  2. Писать лучшие тесты Могу создавать Mock объекты используя полиморфизм.

Пример с Mock:

interface PaymentProcessor {
  void process(Payment payment);
}

class RealPaymentProcessor implements PaymentProcessor {
  // реальная обработка
}

class MockPaymentProcessor implements PaymentProcessor {
  // для тестирования
}

// В тесте
PaymentProcessor processor = new MockPaymentProcessor();
order.setProcessor(processor);
  1. Отладка проблем Если метод вызывается через полиморфный интерфейс, нужно знать какой класс реально вызывается.

Принцип Liskov Substitution Principle (LSP)

Это один из SOLID принципов: "Объект подкласса можно заменить объектом родительского класса без нарушения работы программы."

Это ключ к правильному полиморфизму.

Полиморфизм — фундаментальная концепция OOP которая делает код гибким и переиспользуемым.