Swift - Héritage

La capacité à prendre plus de forme est définie comme l'héritage. En général, une classe peut hériter des méthodes, propriétés et fonctionnalités d'une autre classe. Les classes peuvent être classées en sous-classe et super classe.

  • Sub Class - lorsqu'une classe hérite des propriétés, méthodes et fonctions d'une autre classe, elle est appelée comme sous-classe

  • Super Class - La classe contenant des propriétés, des méthodes et des fonctions pour hériter d'autres classes d'elle-même est appelée comme une super classe

Les classes Swift 4 contiennent une superclasse qui appelle et accède aux méthodes, propriétés, fonctions et méthodes de substitution. En outre, les observateurs de propriétés sont également utilisés pour ajouter une propriété et modifier les méthodes de propriété stockées ou calculées.

Classe de base

Une classe qui n'hérite pas des méthodes, propriétés ou fonctions d'une autre classe est appelée «classe de base».

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)

Lorsque nous exécutons le programme ci-dessus en utilisant aire de jeux, nous obtenons le résultat suivant -

Swift 4
98
89
76

La classe avec le nom de classe StudDetails est définie ici comme une classe de base qui est utilisée pour contenir le nom des étudiants, et trois sujets marquent comme mark1, mark2 et mark3. Le mot-clé 'let' est utilisé pour initialiser la valeur de la classe de base et la valeur de la classe de base est affichée dans le terrain de jeu à l'aide de la fonction 'print'.

Sous-classe

L'action de baser une nouvelle classe sur une classe existante est définie comme «Sous-classe». La sous-classe hérite des propriétés, méthodes et fonctions de sa classe de base. Pour définir une sous-classe, «:» est utilisé avant le nom de la classe de base

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()

Lorsque nous exécutons le programme ci-dessus en utilisant aire de jeux, nous obtenons le résultat suivant -

Mark1:93, Mark2:89

La classe 'StudDetails' est définie comme une super classe où les notes des élèves sont déclarées et la sous-classe 'display' est utilisée pour hériter des notes de sa super classe. La sous-classe définit les notes des étudiants et appelle la méthode print () pour afficher la note des étudiants.

Primordial

L'accès à l'instance de super-classe, aux méthodes de type, à l'instance, aux propriétés de type et à la sous-classe d'indices fournit le concept de substitution. Le mot clé 'override' est utilisé pour remplacer les méthodes déclarées dans la superclasse.

Accès aux méthodes, propriétés et indices de super classe

Le mot clé 'super' est utilisé comme préfixe pour accéder aux méthodes, propriétés et indices déclarés dans la super classe

Primordial Accès aux méthodes, propriétés et indices
Méthodes super.somemethod ()
Propriétés super.someProperty ()
Les indices super [someIndex]

Remplacement des méthodes

Les méthodes d'instance et de type héritées peuvent être remplacées par le mot-clé 'override' par nos méthodes définies dans notre sous-classe. Ici, print () est remplacé dans la sous-classe pour accéder à la propriété type mentionnée dans la super classe print (). Une nouvelle instance de la super classe cricket () est également créée en tant que «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()

Lorsque nous exécutons le programme ci-dessus en utilisant aire de jeux, nous obtenons le résultat suivant -

Welcome to Swift Super Class
Welcome to Swift Sub Class

Remplacement de propriété

Vous pouvez remplacer une instance héritée ou une propriété de classe pour fournir vos propres getter et setter personnalisés pour cette propriété, ou pour ajouter des observateurs de propriété pour permettre à la propriété de remplacement d'observer quand la valeur de propriété sous-jacente change.

Remplacer les acquéreurs et les setters de propriété

Swift 4 permet à l'utilisateur de fournir un getter et un setter personnalisés pour remplacer la propriété héritée, qu'il s'agisse d'une propriété stockée ou calculée. La sous-classe ne connaît pas le nom et le type de propriété hérités. Par conséquent, il est essentiel que l'utilisateur spécifie dans la sous-classe, le nom et le type de la propriété de substitution spécifiée dans la super classe.

Cela peut être fait de deux manières -

  • Lorsque setter est défini pour la propriété de substitution, l'utilisateur doit également définir getter.

  • Lorsque nous ne voulons pas modifier le getter de propriété hérité, nous pouvons simplement passer la valeur héritée par la syntaxe «super.someProperty» à la super classe.

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)")

Lorsque nous exécutons le programme ci-dessus en utilisant aire de jeux, nous obtenons le résultat suivant -

Radius of rectangle for 25.0  is now overridden as 3

Remplacer les observateurs de propriété

Lorsqu'une nouvelle propriété doit être ajoutée pour une propriété héritée, le concept de «remplacement de propriété» est introduit dans Swift 4. Cela avertit l'utilisateur lorsque la valeur de propriété héritée est modifiée. Mais le remplacement ne s'applique pas aux propriétés stockées constantes héritées et aux propriétés calculées héritées en lecture seule.

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)")

Lorsque nous exécutons le programme ci-dessus en utilisant aire de jeux, nous obtenons le résultat suivant -

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

Propriété finale pour empêcher le remplacement

Lorsque l'utilisateur n'a pas besoin de vouloir que d'autres accèdent aux méthodes, propriétés ou indices de la super classe, Swift 4 introduit la propriété «finale» pour empêcher le remplacement. Une fois la propriété 'finale' déclarée, les indices ne permettront pas de remplacer les méthodes, propriétés et indices de la super classe. Il n'y a aucune disposition pour avoir la propriété «finale» dans la «super classe». Lorsque la propriété «finale» est déclarée, l'utilisateur est limité à créer d'autres sous-classes.

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)")

Lorsque nous exécutons le programme ci-dessus en utilisant aire de jeux, nous obtenons le résultat suivant -

<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

Puisque la super classe est déclarée comme «finale» et que ses types de données sont également déclarés comme «final», le programme ne permettra pas de créer davantage de sous-classes et il lancera des erreurs.