Что такое статическая диспетчеризация в ООП?

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

Ответ

Статическая диспетчеризация (или раннее связывание) — это механизм вызова метода, при котором компилятор на этапе компиляции определяет точную реализацию функции или метода, которая будет выполнена.

Ключевые характеристики:

  • Высокая производительность: Нет накладных расходов на поиск метода во время выполнения.
  • Отсутствие полиморфизма: Не позволяет выбирать реализацию в зависимости от типа объекта в runtime.
  • Возможности для оптимизации: Компилятор может заинлайнить (inline) вызов метода.

В Swift статическая диспетчеризация используется для:

  1. Глобальных и вложенных функций.
  2. final методов и классов.
  3. static методов.
  4. private методов (в пределах файла компилятор знает точный тип).
  5. Методов, вызываемых непосредственно на конкретном типе (без использования протокола или родительского класса).

Пример:

class Animal {
    // Обычный метод - может использовать динамическую диспетчеризацию
    func makeSound() { print("Some sound") }

    // final метод - всегда статическая диспетчеризация
    final func breathe() { print("Breathing") }
}

final class Dog: Animal { // final класс - вся диспетчеризация внутри него статическая
    override func makeSound() { print("Bark") }
}

let myDog = Dog()
myDog.breathe() // Статическая диспетчеризация (final метод)
myDog.makeSound() // Для final класса компилятор также может использовать статическую диспетчеризацию

let someAnimal: Animal = Dog()
someAnimal.makeSound() // Динамическая диспетчеризация (вызов через vtable)

Итог: Используйте final и private для критичных к производительности методов и классов, которые не предназначены для дальнейшего наследования или переопределения.