Héritage en Swift

Introduction à l'héritage

L'héritage est un concept central dans la programmation orientée objet qui permet de transférer des propriétés, des méthodes et d'autres caractéristiques d'une classe à une autre. Cette fonctionnalité unique distingue les classes des autres types de données en Swift.

Classes Parent et Enfant

Lorsqu'une classe hérite d'une autre, elle est appelée classe enfant ou sous-classe. La classe dont elle hérite est appelée classe parente ou superclasse.

Syntaxe de l'héritage

Pour qu'une classe puisse hériter d'une autre, la syntaxe suivante est utilisée :

class SuperClass {
    // Définition de la superclasse ici
}

class SubClass: SuperClass {
    // Définition de la sous-classe ici
}

La sous-classe héritera de toutes les propriétés et méthodes de la superclasse, tout en pouvant également définir ses propres éléments.

Exemple d'héritage

Prenons un exemple simple avec une classe nommée Car qui possède une variable topSpeed initialisée à 200 et une méthode drive() :

class Car {
    var topSpeed = 200
    func drive() {
        print("Driving")
    }
}

Une autre classe peut hériter de Car comme ceci :

class Jeep: Car {
    // Création d'une nouvelle propriété
    var currentNumberOfMiles = 0
}

On peut instancier un objet de type Jeep de cette manière :

let wrangler = Jeep()

Les propriétés peuvent être accédées ou modifiées comme suit :

wrangler.topSpeed = 100
print(wrangler.topSpeed) // Output: 100
wrangler.currentNumberOfMiles = 300
print(wrangler.currentNumberOfMiles) // Output: 300

Surcharge des méthodes

Il est possible de redéfinir un méthode de la superclasse dans la sous-classe grâce au mot clé override. Prenons un autre exemple avec une sous-classe Tesla de Car :

class Tesla: Car {
    override func drive() {
        print("Driving very quietly")
    }
}

Lorsqu'on crée une instance de Tesla et qu'on appelle la méthode drive(), l'implémentation redéfinie sera utilisée :

let modelY = Tesla()
modelY.drive() // Output: Driving very quietly

Accès aux méthodes de la superclasse

Si vous avez besoin d'accéder à la version de la méthode de la superclasse après l'avoir redéfinie, vous pouvez utiliser le mot clé super :

class Tesla: Car {
    override func drive() {
        super.drive() // Appelle la méthode de la superclasse
        print("Driving very quietly")
    }
}

En appelant modelY.drive(), vous obtiendrez :

Driving
Driving very quietly

Prévenir la surcharge

Pour empêcher la redéfinition d'une méthode, vous pouvez utiliser le mot clé final lors de la déclaration de la méthode dans la superclasse. Par exemple :

class Car {
    var topSpeed = 200
    final func drive() {
        print("Driving")
    }
}

class Tesla: Car {
    override func drive() { // ERREUR : tentative de surcharge d'une méthode finale 
        super.drive()
        print("Driving very quietly")
    }
}

Une méthode marquée final ne peut pas être redéfinie, ce qui entraînera une erreur si vous tentez de le faire.