Способность принимать больше формы определяется как Наследование. Как правило, класс может наследовать методы, свойства и функциональные возможности от другого класса. Классы могут быть далее разделены на подкласс и суперкласс.
-
Подкласс — когда класс наследует свойства, методы и функции от другого класса, он называется подклассом
-
Суперкласс — Класс, содержащий свойства, методы и функции для наследования других классов от самого себя, называется суперклассом
Подкласс — когда класс наследует свойства, методы и функции от другого класса, он называется подклассом
Суперкласс — Класс, содержащий свойства, методы и функции для наследования других классов от самого себя, называется суперклассом
Классы Swift 4 содержат суперкласс, который вызывает и обращается к методам, свойствам, функциям и переопределяющим методам. Кроме того, наблюдатели свойств также используются для добавления свойства и изменения методов хранимых или вычисляемых свойств.
Базовый класс
Класс, который не наследует методы, свойства или функции от другого класса, называется «Базовый класс».
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’ суперклассу.
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 вводится понятие «переопределение свойства». Оно уведомляет пользователя об изменении значения унаследованного свойства. Но переопределение не применимо для унаследованных константных хранимых свойств и унаследованных вычисляемых свойств только для чтения.
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’, пользователю запрещается создавать дополнительные подклассы.
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’, программа не разрешит создавать подклассы дальше и будет выдавать ошибки.