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 ballUne 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
RexSeules 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ériterPlacez 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.0Défi
FacileEmployee 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())")
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
1Classes et objets
Travailler avec des fichiersDéfinir des classesMéthodes et selfInitialiseursLes classes sont des référencesRécapitulatif - Carte de bibliothèque4Encapsulation
Contrôle d’accèsLecture seule depuis l’extérieurProtection de l’étatInitialiseurs pouvant échouerRécapitulatif - Compte bancaire7Polymorphisme et génériques
PolymorphismeConversion de typeFonctions génériquesTypes génériquesRécapitulatif - Calculateur de formes2Structures et types valeur
StructuresSémantique de valeurMéthodes mutantesStructure ou classeRécapitulatif - article d’inventaire5Héritage
Sous-classesRedéfinition des méthodesInitialiseurs et superfinal et hiérarchiesRécapitulatif - hiérarchie des employés8Protocoles standard
CustomStringConvertibleEquatableComparableHashableRécapitulatif - Tri personnalisé11Projet : Gestion de bibliothèque
Livres et membresEmprunter des livresEntraînez-vous par vous-même : Playground Swift