Что такое наследование в программировании
Что проверяют
Понимаете ли вы, что в Swift наследование это один из способов переиспользования, а не главный. За ним почти всегда идёт следующий вопрос: где проходит граница между наследником класса, протоколом с расширением и композицией.
Как отвечать
Наследование задаёт отношение «является»: подкласс получает свойства и методы базового класса, добавляет свои и переопределяет поведение через override, при необходимости вызывая базовую реализацию через super.
Дальше переходите к ограничениям Swift, они и отличают ответ от учебника.
Наследуются только классы. Структуры и перечисления наследования не поддерживают, поэтому модельный слой на значимых типах строится через протоколы.
Множественного наследования нет. Общее поведение выносится в протокол с расширением, где лежит реализация по умолчанию.
final запрещает дальнейшее наследование и позволяет компилятору вызывать метод напрямую, минуя таблицу методов.
class ImageLoader {
func load(_ url: URL) async throws -> Data {
try await URLSession.shared.data(from: url).0
}
}
final class CachedImageLoader: ImageLoader {
private var cache: [URL: Data] = [:]
override func load(_ url: URL) async throws -> Data {
if let hit = cache[url] { return hit }
let data = try await super.load(url)
cache[url] = data
return data
}
}Финал по делу: наследование оправдано там, где подтип реально подставляется вместо базового, как в UIKit с контроллерами и ячейками. Нужен просто общий код, дешевле протокол или вложенный объект.
Где спотыкаются
Строят базовый класс на все экраны сразу. Через год в нём логика половины приложения, любая правка задевает всё, а наследника не протестировать в отрыве от родителя.
Плывут на инициализаторах. В Swift есть назначенные и вспомогательные инициализаторы, подкласс обязан задать свои свойства до вызова super.init, а наследование инициализаторов включается лишь при определённых условиях.
Называют наследование единственным механизмом полиморфизма. В Swift чаще работает протокольный: тип подставляется по соответствию протоколу, и это работает со структурами, которые наследовать нельзя.