Учебники

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

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

  • Подкласс — когда класс наследует свойства, методы и функции от другого класса, он называется подклассом

  • Суперкласс — Класс, содержащий свойства, методы и функции для наследования других классов от самого себя, называется суперклассом

Подкласс — когда класс наследует свойства, методы и функции от другого класса, он называется подклассом

Суперкласс — Класс, содержащий свойства, методы и функции для наследования других классов от самого себя, называется суперклассом

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

Базовый класс

Класс, который не наследует методы, свойства или функции от другого класса, называется «Базовый класс».

Live Demo

class StudDetails {
   var stname: String!
   var mark1: Int!
   var mark2: Int!
   var mark3: Int!
   
   init(stname: String, mark1: Int, mark2: Int, mark3: Int) {
      self.stname = stname
      self.mark1 = mark1
      self.mark2 = mark2
      self.mark3 = mark3
   }
}

let stname = "Swift 4"
let mark1 = 98
let mark2 = 89
let mark3 = 76

print(stname)
print(mark1)
print(mark2)
print(mark3)

Когда мы запускаем вышеуказанную программу, используя площадку, мы получаем следующий результат —

Swift 4
98
89
76

Класс с именем класса StudDetails определяется здесь как базовый класс, который содержит имя ученика, а три предмета помечаются как mark1, mark2 и mark3. Ключевое слово «let» используется для инициализации значения для базового класса, а значение базового класса отображается на площадке с помощью функции «print».

Подкласс

Акт базирования нового класса на существующем классе определяется как «Подкласс». Подкласс наследует свойства, методы и функции своего базового класса. Чтобы определить подкласс ‘:’ используется перед именем базового класса

class StudDetails {
   var mark1: Int;
   var mark2: Int;
   
   init(stm1:Int, results stm2:Int) {
      mark1 = stm1;
      mark2 = stm2;
   }
   func print() {
      print("Mark1:\(mark1), Mark2:\(mark2)")
   }
}

class display : StudDetails {
   init() {
      super.init(stm1: 93, results: 89)
   }
}

let marksobtained = display()
marksobtained.print()

Когда мы запускаем вышеуказанную программу, используя площадку, мы получаем следующий результат —

Mark1:93, Mark2:89

Класс ‘StudDetails’ определяется как суперкласс, в котором объявляются оценки учащихся, а подкласс ‘display’ используется для наследования оценок от своего суперкласса. Подкласс определяет оценки учащихся и вызывает метод print () для отображения оценки учащихся.

Переопределение

Доступ к экземпляру суперкласса, методам типа, экземпляру, свойствам типа и подклассу индексов обеспечивает концепцию переопределения. Ключевое слово override используется для переопределения методов, объявленных в суперклассе.

Доступ к методам, свойствам и подпискам суперкласса

Ключевое слово ‘super’ используется в качестве префикса для доступа к методам, свойствам и индексам, объявленным в суперклассе.

Переопределение Доступ к методам, свойствам и подпискам
методы super.somemethod ()
свойства super.someProperty ()
Нижние индексы супер [someIndex]

Переопределение методов

Унаследованные методы экземпляра и типа могут быть переопределены ключевым словом ‘override’ для наших методов, определенных в нашем подклассе. Здесь print () переопределяется в подклассе для доступа к свойству типа, указанному в суперклассе print (). Также новый экземпляр суперкласса cricket () создается как cricinstance.

class cricket {
   func print() {
      print("Welcome to Swift 4 Super Class")
   }
}

class tennis: cricket {
   override func print() {
      print("Welcome to Swift 4 Sub Class")
   }
}

let cricinstance = cricket()
cricinstance.print()

let tennisinstance = tennis()
tennisinstance.print()

Когда мы запускаем вышеуказанную программу, используя площадку, мы получаем следующий результат —

Welcome to Swift Super Class
Welcome to Swift Sub Class

Переопределение собственности

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

Переопределение методов получения и установки свойств

Swift 4 позволяет пользователю предоставлять пользовательские методы получения и установки для переопределения унаследованного свойства, независимо от того, является ли оно хранимым или вычисляемым свойством. Подкласс не знает унаследованного имени и типа свойства. Поэтому важно, чтобы пользователь указал в подклассе имя и тип переопределяющего свойства, указанного в суперклассе.

Это можно сделать двумя способами —

  • Когда setter определен для переопределяющего свойства, пользователь также должен определить getter.

  • Когда мы не хотим изменять получатель унаследованного свойства, мы можем просто передать унаследованное значение с помощью синтаксиса ‘super.someProperty’ суперклассу.

Когда setter определен для переопределяющего свойства, пользователь также должен определить getter.

Когда мы не хотим изменять получатель унаследованного свойства, мы можем просто передать унаследованное значение с помощью синтаксиса ‘super.someProperty’ суперклассу.

Live Demo

class Circle {
   var radius = 12.5
   var area: String {
      return "of rectangle for \(radius) "
   }
}

class Rectangle: Circle {
   var print = 7
   override var area: String {
      return super.area + " is now overridden as \(print)"
   }
}

let rect = Rectangle()
rect.radius = 25.0
rect.print = 3
print("Radius \(rect.area)")

Когда мы запускаем вышеуказанную программу, используя площадку, мы получаем следующий результат —

Radius of rectangle for 25.0  is now overridden as 3

Переопределение наблюдателей за недвижимостью

Когда для унаследованного свойства необходимо добавить новое свойство, в Swift 4 вводится понятие «переопределение свойства». Оно уведомляет пользователя об изменении значения унаследованного свойства. Но переопределение не применимо для унаследованных константных хранимых свойств и унаследованных вычисляемых свойств только для чтения.

Live Demo

class Circle {
   var radius = 12.5
   var area: String {
     return "of rectangle for \(radius) "
   }
}

class Rectangle: Circle {
   var print = 7
   override var area: String {
      return super.area + " is now overridden as \(print)"
   }
}

let rect = Rectangle()
rect.radius = 25.0
rect.print = 3
print("Radius \(rect.area)")

class Square: Rectangle {
   override var radius: Double {
      didSet {
         print = Int(radius/5.0)+1
      }
   }
}

let sq = Square()
sq.radius = 100.0
print("Radius \(sq.area)")

Когда мы запускаем вышеуказанную программу, используя площадку, мы получаем следующий результат —

Radius of rectangle for 25.0  is now overridden as 3
Radius of rectangle for 100.0  is now overridden as 21

Конечное свойство для предотвращения переопределения

Когда пользователю не нужно, чтобы другие обращались к методам суперкласса, свойствам или подпискам, Swift 4 вводит свойство final для предотвращения переопределения. Как только свойство ‘final’ объявлено, индексы не позволят переопределить методы, свойства и его индексы суперкласса. Не существует условия, чтобы иметь свойство ‘final’ в ‘super class’. Когда объявлено свойство ‘final’, пользователю запрещается создавать дополнительные подклассы.

Live Demo

final class Circle {
   final var radius = 12.5
   var area: String {
      return "of rectangle for \(radius) "
   }
}

class Rectangle: Circle {
   var print = 7
   override var area: String {
      return super.area + " is now overridden as \(print)"
   }
}

let rect = Rectangle()
rect.radius = 25.0
rect.print = 3
print("Radius \(rect.area)")

class Square: Rectangle {
   override var radius: Double {
      didSet {
         print = Int(radius/5.0)+1
      }
   }
}

let sq = Square()
sq.radius = 100.0
print("Radius \(sq.area)")

Когда мы запускаем вышеуказанную программу, используя площадку, мы получаем следующий результат —

<stdin>:14:18: error: var overrides a 'final' var
override var area: String {
^
<stdin>:7:9: note: overridden declaration is here
var area: String {
^
<stdin>:12:11: error: inheritance from a final class 'Circle'
class Rectangle: Circle {
^
<stdin>:25:14: error: var overrides a 'final' var
override var radius: Double {
^
<stdin>:6:14: note: overridden declaration is here
final var radius = 12.5

Поскольку суперкласс объявлен как ‘final’, а его типы данных также объявлены как ‘final’, программа не разрешит создавать подклассы дальше и будет выдавать ошибки.