Объектно-ориентированное программирование в Swift

Объектно-ориентированное программирование (ООП) помогает структурировать код с помощью классов. Классы имеют свойства и методы, которые могут наследоваться друг от друга.

Эта статья представляет собой введение в объектно-ориентированное программирование на Swift. Мы углубимся в классы, объекты, свойства, методы и концепцию, называемую наследованием. Я покажу вам на примерах какова цель объектно-ориентированного программирования и почему оно важно в практической разработке под iOS.

Когда вы не используете структуру, подобную объектно-ориентированному программированию, ваш код похож на водопад и течет сверху вниз. Объектно-ориентированное программирование больше похоже на дом: вы определяете фундамент своего кода и строите поверх него отдельные комнаты.

Классы и экземпляры

Давайте начнем с самого важного аспекта объектно-ориентированного программирования – классов. Они являются строительными блоками вашего кода.

Вот пример класса в Swift:

class Car {
 
}

Внутри фигурных скобок вы можете определить переменные, называемые свойствами, и функции, называемые методами, которые принадлежат данному классу Car. Вы можете воспринимать класс как структуру для кода. К примеру, набор инструментов, который содержит отвертку, гаечный ключ, молоток и сверло.

Вы можете создавать экземпляры класса:

class Car {
 
}
 
let ferrari: Car = Car()

Константа ferrari теперь содержит экземпляр класса Car. Мы создали экземпляр с помощью инициализатора Car() и с помощью оператора = присваивания.

Теперь вы можете использовать данный экземпляр Car в вашем коде. Класс Car является типом для константы ferrari.

Вы можете создать столько экземпляров одного класса, сколько захотите. В этом сила объектно-ориентированного программирования. Вы создаете класс Car один раз, а затем используете его, чтобы создать целый гараж автомобилей. Это называется повторным использованием кода и является основой программирования.

Экземпляры класса часто называют объектами.

Давайте попробуем визуализировать абстрактные понятия, такие как классы и экземпляры и проведем аналогию:

  • Класс похож на проект здания. Архитектор рисует план, а затем передает его строителю.
  • Экземпляр похож на само здание. Строитель использует план для создания здания.

При написании кода вашего приложения вы строите целый город, используя множество чертежей. Некоторые из этих чертежей предоставляются правительством (например, Foundation). Другие чертежи разработываются вами, архитектором.

Ваш город – это не просто куча чертежей. Вы создаете экземпляры из этих чертежей – настоящие здания. И если вы один раз создали проект жилого комплекса, далее вы можете использовать его для строительства зданий по всему городу.

Свойства и методы

Класс может определять свойства и методы. Свойства представлены переменными, а методы функциями. Свойства хранят информацию, а методы могут выполнять задачи. Класс структурирует информацию и задачи в вашем коде.

Давайте посмотрим на пример:

class Car {
    var wheels: Int = 0
    var maxSpeed: Int = 0
}

Мы создаем класс с именем Car. Тело класса находится между фигурными скобками {}. Далее мы объявляем два свойства: свойство с именем wheels и свойство с именем maxSpeedtype. Оба они со значением по умолчанию 0. Эти свойства теперь принадлежат данному классу. Каждый экземпляр класса Car теперь будет иметь свойства wheels и maxSpeed.

Теперь мы можем создать экземпляр Ferrari:

let ferrari = Car()
ferrari.wheels = 4
ferrari.maxSpeed = 300

И создать более медленный вездеход:

let atv = Car()
atv.wheels = 8
atv.maxSpeed = 80

Мы используем точечный-синтаксис для доступа к свойствам экземпляра, например ferrari.wheels.

Теперь рассмотрим методы. Когда класс объявляет метод, этот метод становится доступным в каждом экземпляре данного класса:

class Car {
    func drive() {
        print("ВРУУУМ!")
    }
}

В приведенном выше примере мы объявляем метод drive() в классе Car. Когда метод выполняется, он выводит на консоль строку текста “ВРУУУМ!”.

Теперь вы можете вызывать метод drive() класса Car с помощью такого же точечного синтаксиса:

let ferrari = Car()
ferrari.drive()
// ВРУУУМ!

Объектно-ориентированное программирование используется для структурирования вашего кода в классах. Класс может иметь свойства для хранения информации и методы для выполнения определенных задач.

Наследование

Объектно-ориентированное программирование также имеет несколько продвинутых концепций, таких как наследование, полиморфизм, делегирование. Давайте рассмотрим наследование.

Допустим, мы определили класс с именем Vehicle. Затем мы можем создать подклассы из Vehicle, такие как:

  • Bicycle – автомобиль без двигателя и 2 колес.
  • RaceCar – автомобиль с мощным двигателем и 4 колесами.
  • Bus – большой автомобиль с 8 колесами и местом для 50 человек.

Каждый из этих подклассов является транспортным средством, а также определяет свои собственные свойства. Вот что такое наследование.

  • Подкласс наследует свойства и методы от суперкласса.
  • Подкласс может переопределять свойства и методы из суперкласса, заменяя их собственной реализацией.
  • Подкласс может расширять суперкласс новыми свойствами и методами.

Принцип наследования позволяет вам создавать иерархию в вашем коде и помогает вам повторно использовать части вашего кода. Не имеет смысла копировать отдельные свойства и методы, которые объединяют различные виды транспортных средств, когда вы можете использовать их повторно.

Давайте посмотрим на базовый класс Vehicle:

class Vehicle {
    var wheels: Int = 0
 
    func drive() {
        print("Транпорт едет!")
    }
}

Затем создадим подкласс:

class Bus: Vehicle {
    var seats: Int = 0
    var gears: Int = 0
 
    func openDoors() {
        print("Открываем двери")
    }
 
    override func drive() {
        print("Автобус едет")
    }
}

Чтобы увидеть, как работает наследование, создадим экземпляр Bus:

let greyhound = Bus()
greyhound.wheels = 8
greyhound.seats = 200
greyhound.gears = 7

Экземпляр greyhound имеет 8 колес. Свойство wheels наследуется от Vehicle, потому что все транспортные средства имеют колеса. При этом свойство wheels не объявлено в классе Bus. Вместо этого оно объявлено в суперклассе Vehicle и наследуется подклассом Bus.

При вызове метода drive() вызывается его переопределенная реализация:

greyhound.drive()
// Автобус едет

Приведем наш код полностью:

class Vehicle {
    var wheels: Int = 0
    var maxSpeed: Int = 0
 
    func drive() {
        print("Транспорт едет")
    }
}
 
class RaceCar: Vehicle {
    var hasSpoiler = true
 
    override func drive() {
        print("ВРУУМ!")
    }
}
 
class Bus: Vehicle {
    var seats: Int = 0
    var gear: Int = 1
 
    func shiftGears() {
        gear += 1
    }
}
 
let ferrari = RaceCar()
ferrari.wheels = 4
ferrari.hasSpoiler = false
ferrari.drive()
// ВРУУМ!
 
let bicycle = Vehicle()
bicycle.wheels = 2
bicycle.drive()
// Транспорт едет.
 
let greyhound = Bus()
greyhound.wheels = 8
greyhound.shiftGears()
greyhound.shiftGears()
print("Привод: \(greyhound.gear)")
// Привод: 3
Читайте также:
Комментарии (1)
Добавить комментарий

Ваш адрес email не будет опубликован.