Ответ
Witness Table (WT) и Virtual Table (VTable) — это механизмы диспетчеризации методов, но они служат разным целям и используются для разных типов.
Сравнительная таблица
| Признак | Witness Table (Таблица свидетелей) | Virtual Table (Виртуальная таблица) |
|---|---|---|
| Для чего | Диспетчеризация методов протоколов для типов значений (struct, enum) и классов. | Диспетчеризация методов классов при наследовании и полиморфизме. |
| Типы | Реализации протоколов (Protocol Witness Table - PWT). |
Иерархии классов. |
| Время создания | Генерируется во время компиляции для каждого типа, реализующего протокол. | Создается во время компиляции и хранится в метаданных класса. |
| Динамичность | Статична для конкретного типа и протокола. | Динамична: для экземпляра класса вызывается метод из таблицы его фактического (runtime) типа. |
| Основа | Реализация требований протокола. | Механизм наследования и переопределения методов. |
Примеры
// 1. Witness Table для протокола
protocol Drawable {
func draw()
}
struct Circle: Drawable {
// Компилятор создает Witness Table для Circle, реализующего Drawable.
func draw() { print("Drawing a circle") }
}
let shape: Drawable = Circle()
shape.draw() // Вызов через Witness Table для Circle -> Drawable
// 2. Virtual Table для классов
class Animal {
func makeSound() { print("Some sound") } // Запись в vtable Animal
}
class Dog: Animal {
override func makeSound() { print("Woof!") } // Запись в vtable Dog
}
let pet: Animal = Dog() // Статический тип Animal, динамический - Dog
pet.makeSound() // Вызов через vtable Dog -> выведет "Woof!"
Почему это важно:
- Witness Tables позволяют типам значениям (struct) участвовать в полиморфизме через протоколы без накладных расходов наследования.
- Virtual Tables — классический механизм ООП для поддержки наследования и переопределения методов в иерархиях классов.