Ответ
Динамическая диспетчеризация — это механизм вызова метода, при котором конкретная реализация (из класса-наследника) определяется во время выполнения программы, а не на этапе компиляции. Это основа полиморфизма.
Как это работает в Swift:
- Для классов используется таблица виртуальных методов (vtable).
- Для протоколов — таблица свидетелей (witness table).
Пример:
class Vehicle {
func move() { print("Vehicle moves") }
}
class Car: Vehicle {
override func move() { print("Car drives") }
}
let myVehicle: Vehicle = Car() // Тип переменной - родительский
myVehicle.move() // Выведет "Car drives". Реализация выбрана в runtime.
Ключевые особенности:
- Требуется для полиморфизма: Позволяет объектам производных классов обрабатываться через интерфейс базового класса.
- Накладные расходы: Вызов включает поиск в таблице, что медленнее статической диспетчеризации.
- Оптимизация: Ключевое слово
finalотключает возможность переопределения и позволяет компилятору использовать статическую диспетчеризацию, повышая производительность.