Назад к вопросам
Junior
78
questionbank

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

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

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

Различают два основных вида полиморфизма:

  1. Ad-hoc полиморфизм (статический или перегрузка методов):

    • Компилятор определяет нужную реализацию метода во время компиляции.
    • Позволяет использовать одно и то же имя метода для выполнения разных операций, определяющихся типом и количеством аргументов.
    • Пример: Перегрузка операторов или функций с одинаковым именем, но разными параметрами.
  2. Параметрический полиморфизм (с помощью универсальных типов или дженериков):

    • Позволяет создавать функции, классы и структуры, которые могут работать с любым типом данных, не привязываясь к конкретному.
    • Тип данных определяется в момент использования (компиляции).
    • Пример: Массивы (Array<Element>), словари (Dictionary<Key, Value>).
  3. Полиморфизм подтипов (динамический или переопределение методов):

    • Виртуальные методы, реализация которых определяется во время выполнения программы (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

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