Назад к вопросам
Junior
78
questionbank
Что такое полиморфизм в программировании?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Полиморфизм (с греческого "множество форм") – это принцип объектно-ориентированного программирования, позволяющий обрабатывать объекты разных типов с помощью единого интерфейса (одинаковой сигнатуры методов), но с разной реализацией поведения.
Различают два основных вида полиморфизма:
-
Ad-hoc полиморфизм (статический или перегрузка методов):
- Компилятор определяет нужную реализацию метода во время компиляции.
- Позволяет использовать одно и то же имя метода для выполнения разных операций, определяющихся типом и количеством аргументов.
- Пример: Перегрузка операторов или функций с одинаковым именем, но разными параметрами.
-
Параметрический полиморфизм (с помощью универсальных типов или дженериков):
- Позволяет создавать функции, классы и структуры, которые могут работать с любым типом данных, не привязываясь к конкретному.
- Тип данных определяется в момент использования (компиляции).
- Пример: Массивы (
Array<Element>), словари (Dictionary<Key, Value>).
-
Полиморфизм подтипов (динамический или переопределение методов):
- Виртуальные методы, реализация которых определяется во время выполнения программы (runtime) в зависимости от фактического типа объекта, а не типа ссылки.
- Позволяет обращаться к объектам подклассов через ссылку на базовый класс.
- Основан на наследовании и переопределении методов.
- Пример: Вызов метода базового класса на объекте подкласса, где метод был переопределен.
Пример полиморфизма подтипов в Swift:
// Базовый класс
class Shape {
func draw() {
print("Drawing a generic shape")
}
}
// Подкласс 1
class Circle: Shape {
override func draw() { // Переопределение метода
print("Drawing a circle")
}
}
// Подкласс 2
class Square: Shape {
override func draw() { // Переопределение метода
print("Drawing a square")
}
}
// Пример использования
let shapes: [Shape] = [Circle(), Square(), Shape()] // Массив ссылок на базовый класс
for shape in shapes {
shape.draw() // Вызов draw() на каждом объекте - выполнение зависит от реального типа (полиморфизм)
}
Вывод:
Drawing a circle
Drawing a square
Drawing a generic shape
Полиморфизм повышает гибкость, расширяемость и читаемость кода, позволяя работать с разнородными объектами единообразно.