Ответ
Полиморфизм (подтипов) в объектно-ориентированном программировании тесно связан со следующими концепциями, которые часто используются как его синонимы или описывают механизм его реализации:
- Позднее связывание (Late Binding) или динамическая диспетчеризация (Dynamic Dispatch): Механизм, при котором конкретный метод для вызова определяется во время выполнения программы, а не компиляции. Это техническая основа полиморфного поведения.
- Переопределение методов (Method Overriding): Языковая конструкция, позволяющая подклассу предоставить свою реализацию метода, уже определенного в суперклассе. Это основной способ реализации полиморфизма.
- Виртуальные методы (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()
}
}