Hériter des méthodes
Fait partie de la section Object Oriented Programming du Journey Lua de Coddy — leçon 32 sur 70.
Une fois le lien d'héritage établi, les instances de la classe enfant accèdent automatiquement à toutes les méthodes parentes. Cela se produit via la chaîne de recherche de Lua : lorsque vous appelez une méthode sur une instance, Lua parcourt chaque table connectée jusqu'à ce qu'il trouve ce que vous recherchez.
Considérez cette configuration où Animal définit une méthode :breathe() :
local Animal = {}
Animal.__index = Animal
function Animal:new()
local obj = {}
setmetatable(obj, Animal)
return obj
end
function Animal:breathe()
print("Breathing...")
end
-- Dog hérite de Animal
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
function Dog:new()
local obj = {}
setmetatable(obj, Dog)
return obj
endMaintenant, regardez ce qui se passe lorsque nous créons un Dog et appelons la méthode du parent :
local buddy = Dog:new()
buddy:breathe() -- Sortie : Respiration...La classe Dog n'a jamais défini :breathe(), pourtant cela fonctionne. Lua vérifie d'abord buddy, ne trouve rien, puis vérifie Dog, toujours rien, et finit par le trouver dans Animal. Cet héritage automatique de méthodes signifie que vous écrivez le comportement partagé une seule fois dans le parent et que chaque classe enfant en bénéficie immédiatement.
Défi
FacileConstruisons une hiérarchie simple de créatures pour voir l'héritage de méthodes en action ! Vous allez créer une classe parente Animal et une classe enfant Dog, puis démontrer que les instances de Dog peuvent utiliser des méthodes définies uniquement dans Animal.
Vous organiserez votre code sur trois fichiers :
Animal.lua: Définissez votre classe parente avec le modèle de classe standard. Incluez un constructeur:new(name)qui stocke le nom de l'animal, et une méthode:speak()qui affiche le nom de l'animal suivi demakes a sound. Retournez la classe à la fin du fichier.Dog.lua: Définissez votre classe enfant qui hérite d'Animal. Importez le module Animal et mettez en place le lien d'héritage pour que Dog puisse accéder aux méthodes d'Animal. Incluez un constructeur:new(name)qui stocke le nom et définit Dog comme métatable. La classe Dog ne doit PAS définir sa propre méthode:speak()— elle en héritera d'Animal.main.lua: Importez votre module Dog, lisez un nom depuis l'entrée, créez une instance de Dog avec ce nom, et appelez la méthode:speak()sur celle-ci.
Vous recevrez une entrée : le nom du chien.
Par exemple, si l'entrée est Buddy, la sortie devrait être :
Buddy makes a soundLa magie ici est que votre classe Dog ne définit jamais :speak(), pourtant l'appeler sur une instance de Dog fonctionne parfaitement. Lua suit la chaîne de recherche de l'instance Dog vers la classe Dog, puis vers la classe Animal où il trouve la méthode. C'est l'héritage à l'œuvre !
Aide-mémoire
Les instances de la classe enfant accèdent automatiquement à toutes les méthodes parentes via la chaîne de recherche de Lua. Lorsqu'une méthode est appelée sur une instance, Lua effectue une recherche à travers chaque table connectée jusqu'à ce qu'il trouve la méthode.
Mise en place de l'héritage
Définition de la classe parente :
local Animal = {}
Animal.__index = Animal
function Animal:new()
local obj = {}
setmetatable(obj, Animal)
return obj
end
function Animal:breathe()
print("Breathing...")
endClasse enfant avec lien d'héritage :
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
function Dog:new()
local obj = {}
setmetatable(obj, Dog)
return obj
endUtilisation des méthodes héritées
Les instances enfants peuvent appeler des méthodes parentes même si elles ne sont pas définies dans la classe enfant :
local buddy = Dog:new()
buddy:breathe() -- Output: Breathing...La chaîne de recherche : Lua vérifie buddy → Dog → Animal jusqu'à ce que la méthode soit trouvée.
Organisation des classes en plusieurs fichiers
Fichier de la classe parente (Animal.lua) :
local Animal = {}
Animal.__index = Animal
function Animal:new(name)
local obj = {name = name}
setmetatable(obj, Animal)
return obj
end
function Animal:speak()
print(self.name .. " makes a sound")
end
return AnimalFichier de la classe enfant (Dog.lua) :
local Animal = require("Animal")
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
function Dog:new(name)
local obj = {name = name}
setmetatable(obj, Dog)
return obj
end
return DogUtilisation dans le fichier principal :
local Dog = require("Dog")
local buddy = Dog:new("Buddy")
buddy:speak() -- Output: Buddy makes a soundEssayez vous-même
-- main.lua: Point d'entrée
local Dog = require('Dog')
-- Lire le nom du chien à partir de l'entrée
local name = io.read()
-- TODO: Créer une instance de Dog avec le nom donné
-- TODO: Appeler la méthode :speak() sur l'instance du chien
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Object Oriented Programming
1Le concept de « self »
Tables avec fonctions« self » expliciteLa syntaxe avec deux-pointsPoint vs deux-pointsRécapitulatif - Point mobile4Projet : Banque numérique
Configuration du projetMéthode de dépôt7Polymorphisme et Redéfinition
Redéfinition de méthodesAppeler des méthodes parentesDuck TypingInterface communeVérification du typeRécapitulatif - Rôles des employés10Projet : Gestionnaire de formes
Configuration du projetClasse Rectangle2Modèle de prototype de classe
Le concept de prototypeLiaison avec __indexLe constructeur :new()Initialisation des attributsInstances indépendantesRécapitulatif - Usine de voitures5Surcharge d'opérateurs en POO
Additionner des objetsSoustraire des objetsConcaténer des objetsComparer des objets (<, >)Récapitulatif - Calculs de portefeuille8Encapsulation
Conventions de nommageClosures pour la confidentialitéAccès via les ClosuresTables en lecture seuleLogique de validationRécapitulatif - Coffre-fort sécurisé11Patrons de conception (Lite)
Fonctions FactoryTable SingletonPatron IteratorObserver (Écouteur)Récapitulatif - Logger Factory3État et comportement des objets
Variables d'instanceMéthodes GetterMéthodes SetterPropriétés calculéesFormatage de chaînesVérifications d'égalitéRécapitulatif - Note de l'étudiant6Bases de l'héritage
Mise en place de l'héritageHériter des méthodesÉtendre le constructeurAjouter des méthodes enfantsPartagé vs UniqueRécapitulatif - Hiérarchie des formes