Classes ouvertes et sous-classes
Fait partie de la section Programmation orientée objet du Journey Kotlin de Coddy. Leçon 17 sur 57.
Héritage permet à une classe de s’appuyer sur une autre. La sous-classe obtient chaque propriété et méthode de sa superclasse et peut ajouter les siennes. Les classes Kotlin sont fermées par défaut, donc une classe doit être marquée open avant qu’une autre classe puisse en hériter :
open class Animal(val name: String) {
fun describe() = "$name is an animal"
}
class Dog(name: String) : Animal(name) {
fun fetch() = "$name fetches the ball"
}Dans main :
val rex = Dog("Rex")
println(rex.describe())
println(rex.fetch())Résultat :
Rex is an animal
Rex fetches the ballclass Dog(name: String) : Animal(name) indique que Dog étend Animal et transmet name au constructeur de la superclasse. Le paramètre n’a pas de val, car la propriété existe déjà dans Animal. Une classe qui n’est pas open ne peut pas être étendue :
class Plant(val name: String)
// class Tree(name: String) : Plant(name) // erreur : ce type est final, il ne peut donc pas être étendu
open class Vehicle(val wheels: Int)
class Bike : Vehicle(2) // passe une valeur fixe
class Truck(val load: Int) : Vehicle(6) // ajoute sa propre propriétéUn Dog est un Animal, donc une instance de sous-classe peut être utilisée partout où le type de la superclasse est attendu. Une List<Animal> peut contenir des chiens, des chats et des animaux ordinaires, et chaque élément possède les membres de Animal :
open class Animal(val name: String) {
fun describe() = "$name is an animal"
}
class Dog(name: String) : Animal(name)
class Cat(name: String, val indoor: Boolean) : Animal(name)Dans main :
val pets: List<Animal> = listOf(Dog("Rex"), Cat("Tom", true), Animal("Generic"))
for (p in pets) println(p.describe())Sortie :
Rex is an animal
Tom is an animal
Generic is an animalL’héritage modélise une relation est-un : un chien est un animal, un compte d’épargne est un compte. Lorsqu’une classe utilise simplement une autre classe (une voiture possède un moteur), donnez-lui plutôt une propriété de ce type. Les classes fermées sont la valeur par défaut de Kotlin : ainsi, une classe destinée à être étendue l’indique avec open, et toutes les autres classes gardent leur comportement à l’abri des sous-classes.
open class Account(val owner: String)
class SavingsAccount(owner: String) : Account(owner) // est-un : héritage
class Engine(val horsepower: Int)
class Car(val engine: Engine) // a-un : une propriétéDéfi
FacileManager répète ce que Employee possède déjà. Rendez Employee ouverte et transformez Manager en sa sous-classe : Manager(name: String, salary: Int) transmet les deux valeurs à Employee et ne conserve que ce qui est nouveau, une liste privée de noms de subordonnés avec addReport(name) et teamSize(). Dans Employee, raise(percent) augmente le salaire de ce pourcentage, en arrondissant vers le bas, et describe() renvoie Ada earns 5500.
Le code fourni crée un responsable à partir de la première ligne (name,salary), ajoute chaque nom suivant comme subordonné, accorde une augmentation de 10 % et affiche Ada earns 5500 and leads 2, puis vérifie qu’un responsable est un Employee.
Votre code doit être placé dans Employee.kt et Manager.kt. Main.kt contient le code fourni pour les entrées et sorties et ne peut pas être modifié.
Essayez vous-même
fun main() {
// Code d'entrée/sortie fourni : le garder tel quel
val input = generateSequence(::readLine).toList()
val (name, salary) = input[0].split(",")
val boss = Manager(name, salary.toInt())
for (report in input.drop(1)) boss.addReport(report)
boss.raise(10)
println("${boss.describe()} and leads ${boss.teamSize()}")
println("a manager is an employee: ${(boss as Any) is Employee}")
}
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 classesConstructeurs primairesBlocs init et validationConstructeurs secondairesRécapitulatif - Carte de bibliothèque4Héritage
Classes ouvertes et sous-classesRedéfinition des membressuper et constructeursClasses abstraitesRécapitulatif – Annuaire du personnel2Propriétés et encapsulation
Accesseurs personnalisésModificateurs de visibilitéSetters privéslazy et lateinitRécapitulatif - Compte bancaire5Interfaces
Déclarer des interfacesMéthodes par défautInterfaces multiplesInterfaces en tant que typesRécapitulatif - Méthodes de paiement8Génériques
Fonctions génériquesClasses génériquesContraintes de typeVariance avec in et outRécapitulatif - File de priorité11Projet : Gestion de bibliothèque
Livres et membresEmprunter des livresEntraînez-vous par vous-même : Playground Kotlin