Что выведет код Senior Протоколы, POP и дженерики обновлено
Что выведет Swift: подкласс и реализация по умолчанию
Вопрос
Что выведет код?
protocol Named { func name() -> String }
extension Named { func name() -> String { "default" } }
class Base: Named {}
class Child: Base {
func name() -> String { "child" }
}
let x: any Named = Child()
print(x.name())
print(Child().name())
Попробуйте сами
Напишите, что выведет код: каждый вывод с новой строки.
Показать ответ и разбор
Коротко
Код выведет: default, child. Соответствие Named объявил Base, и в его witness table попала реализация по умолчанию из расширения: у Base своего метода нет.
Что выведет
default
child
Разбор
Соответствие Named объявил Base, и в его witness table попала реализация по умолчанию из расширения: у Base своего метода нет. Child.name() не переопределение (в Base переопределять нечего), поэтому через протокол вызывается default. Лечится реализацией name() в Base и override в Child.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Что выведет Swift: перегрузка и дженерик
Следующий вопрос
Протокольно-ориентированное программирование
Термины по теме
Ещё по теме «Протоколы, POP и дженерики»
- Протокол делегата и weak
- Протокол с associatedtype как тип параметра
- Условное соответствие протоколу
- Метод из расширения протокола: какая реализация вызовется
- Ограничение дженерика Comparable
- Как ускорить вызов методов класса
- Что такое associatedtype
- Виды диспетчеризации в Swift