Какие термины в программировании являются синонимами полиморфизму?

«Какие термины в программировании являются синонимами полиморфизму?» — вопрос из категории ООП, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Полиморфизм (подтипов) в объектно-ориентированном программировании тесно связан со следующими концепциями, которые часто используются как его синонимы или описывают механизм его реализации:

  1. Позднее связывание (Late Binding) или динамическая диспетчеризация (Dynamic Dispatch): Механизм, при котором конкретный метод для вызова определяется во время выполнения программы, а не компиляции. Это техническая основа полиморфного поведения.
  2. Переопределение методов (Method Overriding): Языковая конструкция, позволяющая подклассу предоставить свою реализацию метода, уже определенного в суперклассе. Это основной способ реализации полиморфизма.
  3. Виртуальные методы (Virtual Methods): В таких языках, как C++ и Java (где все не-статические, не-приватные и не-final методы по умолчанию виртуальны), это методы, вызов которых разрешается через механизм позднего связывания.

Пример, иллюстрирующий связь этих понятий:

abstract class Shape {
    // Виртуальный метод (в терминологии C++) / метод, доступный для переопределения
    abstract double area(); // Объявление контракта
}

class Circle extends Shape {
    private double radius;
    Circle(double r) { this.radius = r; }

    @Override // Переопределение метода (Method Overriding)
    double area() {
        return Math.PI * radius * radius;
    }
}

class Square extends Shape {
    private double side;
    Square(double s) { this.side = s; }

    @Override // Переопределение метода (Method Overriding)
    double area() {
        return side * side;
    }
}

public class Main {
    public static void main(String[] args) {
        Shape shape1 = new Circle(5);
        Shape shape2 = new Square(4);

        // Полиморфный вызов. Какой именно area() выполнится,
        // определяется во время выполнения (Позднее связывание / Dynamic Dispatch).
        System.out.println("Circle area: " + shape1.area()); // Вызовется Circle.area()
        System.out.println("Square area: " + shape2.area()); // Вызовется Square.area()
    }
}