Héritage rapide


L'héritage peut être compris comme une classe acquérant les méthodes et les attributs d'une autre classe.

Lorsqu'une classe hérite d'autres classes, la classe héritière est appelée une sous-classe et la classe héritée est appelée une superclasse (ou classe parent)

Dans Swift, une classe peut appeler et accéder au méthodes des scripts de superclasse, d'attribut et d'indice, et ils peuvent être remplacés.

Nous pouvons également ajouter des observateurs de propriétés pour les propriétés héritées de la classe.


Classe de base

Une classe qui n'hérite pas d'autres classes est appelée une classe de base.

Dans l'exemple suivant, nous définissons la classe de base StudDetails, décrivant l'étudiant (stname) et les scores (mark1, mark2, mark3) de chaque matière :

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"
let mark1 = 98
let mark2 = 89
let mark3 = 76

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

Le résultat de sortie du L'exécution du programme ci-dessus est :

swift
98
89
76
swift
98
89
76

Sous-classe

La sous-classe fait référence à la création d'une nouvelle classe basée sur une classe existante.

Afin d'indiquer la superclasse d'une certaine classe, écrivez le nom de la superclasse après le nom de la sous-classe, séparé par deux points (:). Le format de syntaxe est le suivant

class SomeClass: SomeSuperclass {
    // 类的定义
}

Exemple<🎜). >

Dans l'exemple suivant, nous définissons la super classe StudDetails, puis utilisons la sous-classe Tom pour en hériter :

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

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

let tom = Tom()
tom.show()

Le résultat de sortie de l'exécution du programme ci-dessus est :

Mark1:93, Mark2:89


Surcharge

Les sous-classes peuvent implémenter leurs propres fonctions personnalisées via des méthodes d'instance héritées, des méthodes de classe, des attributs d'instance ou des scripts d'indice. Nous appelons ce comportement la substitution.

Nous pouvons utiliser le mot-clé override pour implémenter la réécriture.

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

Vous pouvez accéder aux méthodes, propriétés ou indices de super classe en utilisant le super préfixe.


Remplacer les méthodes et les propriétés

Remplacer les méthodes

Dans notre sous-classe, nous pouvons utiliser le mot-clé override pour remplacer la méthode de la superclasse.

Dans l'exemple suivant, nous avons réécrit la méthode show() :

class SuperClass {
    func show() {
        print("这是超类 SuperClass")
    }
}

class SubClass: SuperClass  {
    override func show() {
        print("这是子类 SubClass")
    }
}

let superClass = SuperClass()
superClass.show()

let subClass = SubClass()
subClass.show()

Le résultat de sortie de l'exécution du programme ci-dessus est :

这是超类 SuperClass
这是子类 SubClass

Réécrire les attributs

Vous pouvez fournir des getters (ou setters) personnalisés pour remplacer toute propriété héritée, que la propriété héritée soit stockée ou calculée.

La sous-classe ne sait pas si les attributs hérités sont stockés ou calculés. Elle sait seulement que les attributs hérités auront un nom et un type. Ainsi, lorsque vous remplacez un attribut, vous devez écrire son nom et son type.

Remarque :

  • Si vous fournissez un setter dans une propriété remplacée, vous devez également fournir un getter.

  • Si vous ne souhaitez pas modifier la valeur de la propriété héritée dans le getter dans la version remplacée, vous pouvez directement renvoyer la valeur héritée via super.someProperty, où someProperty est la valeur que vous voulez important Écrivez le nom de la propriété.

Dans l'exemple suivant, nous définissons la super classe Circle et la sous-classe Rectangle. Dans la classe Rectangle, nous remplaçons la zone d'attribut :

class Circle {
    var radius = 12.5
    var area: String {
        return "矩形半径 \(radius) "
    }
}

// 继承超类 Circle
class Rectangle: Circle {
    var print = 7
    override var area: String {
        return super.area + " ,但现在被重写为 \(print)"
    }
}

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

Le résultat de sortie de. l'exécution du programme ci-dessus est :

Radius 矩形半径 25.0  ,但现在被重写为 3

Remplacement des observateurs de propriété

Vous pouvez ajouter des observateurs de propriété pour une propriété héritée dans les remplacements de propriété. De cette façon, vous détecterez quand la valeur de la propriété héritée change.

Remarque : Vous ne pouvez pas ajouter d'observateurs de propriétés pour les propriétés stockées constantes héritées ou les propriétés calculées héritées en lecture seule.

class Circle {
    var radius = 12.5
    var area: String {
        return "矩形半径为 \(radius) "
    }
}

class Rectangle: Circle {
    var print = 7
    override var area: String {
        return super.area + " ,但现在被重写为 \(print)"
    }
}


let rect = Rectangle()
rect.radius = 25.0
rect.print = 3
print("半径: \(rect.area)")

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


let sq = Square()
sq.radius = 100.0
print("半径: \(sq.area)")
rrree

Empêcher la réécriture

Nous pouvons utiliser le mot-clé final pour éviter qu'ils soient remplacés.

Si vous remplacez la méthode finale, l'attribut ou le script d'indice, une erreur sera signalée lors de la compilation.

Vous pouvez marquer la classe entière comme finale en ajoutant l'attribut final (classe finale) avant le mot-clé class. Une telle classe ne peut pas être héritée, sinon une erreur de compilation sera signalée.

半径: 矩形半径为 25.0  ,但现在被重写为 3
半径: 矩形半径为 100.0  ,但现在被重写为 21

Étant donné que l'exemple ci-dessus utilise le mot-clé final et ne permet pas la réécriture, l'exécution signalera une erreur :

final class Circle {
    final var radius = 12.5
    var area: String {
        return "矩形半径为 \(radius) "
    }
}
class Rectangle: Circle {
    var print = 7
    override var area: String {
        return super.area + " ,但现在被重写为 \(print)"
    }
}

let rect = Rectangle()
rect.radius = 25.0
rect.print = 3
print("半径: \(rect.area)")

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

let sq = Square()
sq.radius = 100.0
print("半径: \(sq.area)")