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

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

Ответ

Цепочка наследования — это иерархия классов, где подкласс наследует свойства, методы и другие характеристики от своего суперкласса, который, в свою очередь, может наследовать от своего родителя, и так далее.

Основные принципы в Swift:

  • Одиночное наследование: Класс может иметь только одного прямого суперкласса.
  • Доступ к родителю: Ключевое слово super позволяет обратиться к реализации суперкласса.
  • Переопределение: Методы и свойства можно переопределять с помощью модификатора override.

Пример иерархии:

// Базовый класс
class Vehicle {
    var currentSpeed = 0.0
    func makeSound() {
        print("Some generic vehicle sound")
    }
}

// Первый уровень наследования
class Car: Vehicle {
    var gear = 1
    override func makeSound() {
        print("Vroom!")
    }
}

// Второй уровень наследования (цепочка: ElectricCar -> Car -> Vehicle)
class ElectricCar: Car {
    var batteryLevel = 100
    func charge() {
        batteryLevel = 100
        print("Charged!")
    }
    // Может переопределить метод из Car или Vehicle
}

// Использование
let myCar = ElectricCar()
myCar.currentSpeed = 60.0 // Свойство унаследовано от Vehicle
myCar.gear = 2            // Свойство унаследовано от Car
myCar.makeSound()         // Вызовет переопределенный метод из Car: "Vroom!"
myCar.charge()            // Собственный метод ElectricCar

Важные замечания:

  1. Инициализация: Инициализаторы должны правильно инициализировать все свойства своего класса и вызывать инициализаторы суперкласса.
  2. Доступность (open, public, internal): Переопределить можно только те методы суперкласса, которые объявлены как доступные для этого (например, с модификаторами open или public).
  3. Альтернативы наследованию: Для большей гибкости часто предпочтительнее использовать композицию (протоколы, внедрение зависимостей) вместо глубоких цепочек наследования.