Menu
Coddy logo textTech

Sous-classes

Fait partie de la section Programmation orientée objet du Journey Swift de Coddy. Leçon 22 sur 57.

Héritage permet à une classe de s’appuyer sur une autre. class Dog: Animal fait de Dog une sous-classe de la superclasse Animal : un chien possède toutes les propriétés et méthodes d’un animal, ainsi que ce que Dog ajoute :

class Animal {
    var name: String
    init(name: String) { self.name = name }
    func describe() -> String { "\(name) is an animal" }
}

class Dog: Animal {
    func fetch() -> String { "\(name) fetches the ball" }
}

let rex = Dog(name: "Rex")
print(rex.describe())
print(rex.fetch())

Sortie :

Rex is an animal
Rex fetches the ball

Une sous-classe qui n’ajoute aucune propriété stockée hérite des initialiseurs de la superclasse, c’est pourquoi Dog(name:) fonctionne sans init dans Dog. L’héritage modélise une relation est-un : chaque chien est un animal, donc un Dog peut être utilisé partout où un Animal est attendu :

class Animal {
    var name: String
    init(name: String) { self.name = name }
}

class Cat: Animal {}
class Dog: Animal {}

let pets: [Animal] = [Cat(name: "Tom"), Dog(name: "Rex")]
for pet in pets { print(pet.name) }

Sortie :

Tom
Rex

Seules les classes prennent en charge l’héritage : les structures et les énumérations ne peuvent pas hériter. Une classe a au plus une superclasse, mais une superclasse peut avoir de nombreuses sous-classes, formant une hiérarchie :

class Vehicle { var wheels = 0 }
class Car: Vehicle { }        // Car est un Vehicle
class Bike: Vehicle { }       // Bike est un Vehicle
// struct Truck: Vehicle { }  // erreur : les structs ne peuvent pas hériter

Placez ce que toutes les sous-classes ont en commun dans la superclasse, et uniquement les différences dans chaque sous-classe. Lorsqu’un type n’est pas réellement une sorte de l’autre, l’héritage est le mauvais outil : une propriété contenant l’autre type convient souvent mieux.

class Shape {
    var name: String
    init(name: String) { self.name = name }
    func label() -> String { "a \(name)" }
}

class Square: Shape {
    var side = 1.0
    func area() -> Double { side * side }
}

let s = Square(name: "square")
s.side = 3
print(s.label())
print(s.area())

Sortie :

a square
9.0
challenge icon

Défi

Facile

Employee stocke un name et un salary, et possède une méthode raise(by:) qui augmente le salaire d'un pourcentage (arrondi à l'inférieur). Déclarez une sous-classe Manager qui ajoute une propriété stockée reports (un tableau de noms, vide au départ), ainsi qu'une méthode addReport(_:) et une méthode teamSize() qui renvoie le nombre de rapports.

Le code fourni crée un manager à partir de la première ligne (name,salary), ajoute chaque nom suivant comme rapport, accorde une augmentation de 10 %, puis affiche Ada earns 5500 and leads 2.

Votre code doit être placé dans Employee.swift et Manager.swift. main.swift contient le code fourni pour les entrées et les sorties et ne peut pas être modifié.

Essayez vous-même

// Code d'entrée/sortie fourni : le garder tel quel
var input: [String] = []
while let line = readLine() { input.append(line) }
let head = input[0].split(separator: ",").map(String.init)
let boss = Manager(name: head[0], salary: Int(head[1])!)
for name in input.dropFirst() { boss.addReport(name) }
boss.raise(by: 10)
print("\(boss.name) earns \(boss.salary) and leads \(boss.teamSize())")
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Playground Swift