Partagé vs Unique
Fait partie de la section Programmation orientée objet du Journey Lua de Coddy. Leçon 35 sur 70.
Lorsque vous travaillez avec l’héritage, il est important de comprendre où se trouve chaque élément de données. Certains attributs sont partagés : définis dans la classe parente et accessibles à tous les enfants. D’autres sont uniques : créés spécifiquement dans la classe enfant ou l’instance.
Considérez cette hiérarchie :
local Animal = {}
Animal.__index = Animal
Animal.kingdom = "Animalia" -- Partagé : défini sur la classe
function Animal:new(name)
local obj = {name = name} -- Unique : stocké sur chaque instance
setmetatable(obj, Animal)
return obj
endlocal Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
Dog.sound = "bark" -- Partagé parmi tous les Dogs
function Dog:new(name, breed)
local obj = Animal.new(Animal, name)
obj.breed = breed -- Unique : chaque Dog a sa propre race
setmetatable(obj, Dog)
return obj
endLorsque vous créez une instance de Dog, certaines valeurs existent directement sur l’objet, tandis que d’autres sont trouvées via la chaîne de recherche :
local rex = Dog:new("Rex", "German Shepherd")
-- Unique à cette instance (stocké sur rex)
print(rex.name) -- "Rex"
print(rex.breed) -- "German Shepherd"-- Partagé (trouvé via lookup)
print(rex.sound) -- "bark" (de Dog)
print(rex.kingdom) -- "Animalia" (de Animal)La distinction essentielle : les champs affectés à obj dans les constructeurs sont propres à chaque instance, tandis que les champs définis directement dans les tables de classes sont partagés entre toutes les instances de cette classe et de ses classes enfants.
Défi
FacileExplorons comment les données circulent dans une hiérarchie d'héritage en construisant un système de classes Creature et Dragon. Tu verras concrètement quels attributs sont partagés entre toutes les instances et lesquels sont propres à chaque objet individuel.
Tu organiseras ton code sur trois fichiers :
Creature.lua: définis ta classe parente avec un attribut partagé au niveau de la classeworld = "Fantasy Realm"que toutes les créatures partagent. Inclus un constructeur:new(name)qui enregistre le nom de la créature comme attribut d'instance.Dragon.lua: définis ta classe enfant qui hérite de Creature. Ajoute un attribut partagé au niveau de la classeelement = "fire"que tous les dragons partagent. Ton constructeur:new(name, color)doit appeler le constructeur parent pour le nom, puis ajoutercolorcomme attribut d'instance unique pour chaque dragon.main.lua: crée deux dragons différents et examine leurs attributs afin de montrer la différence entre les données partagées et les données uniques.
Tu recevras deux entrées :
- Le nom et la couleur du premier dragon, séparés par une virgule (par exemple :
Smaug,red) - Le nom et la couleur du deuxième dragon, séparés par une virgule (par exemple :
Draco,gold)
Dans ton fichier principal, crée les deux dragons avec leurs noms et couleurs respectifs. Affiche ensuite les informations suivantes dans cet ordre exact :
- Le
namedu premier dragon - Le
colordu premier dragon - Le
namedu deuxième dragon - Le
colordu deuxième dragon - Le
elementdu premier dragon (partagé depuis la classe Dragon) - Le
elementdu deuxième dragon (partagé depuis la classe Dragon) - Le
worlddu premier dragon (partagé depuis la classe Creature)
Par exemple, si les entrées sont Smaug,red et Draco,gold, la sortie doit être :
Smaug
red
Draco
gold
fire
fire
Fantasy RealmRemarque que name et color sont différents pour chaque dragon (attributs d'instance uniques), tandis que element et world sont identiques pour les deux (attributs de classe partagés trouvés par le biais de la chaîne de recherche).
Essayez vous-même
-- main.lua: Créer des dragons et démontrer les attributs partagés vs uniques
local Dragon = require('Dragon')
-- Lire l'entrée pour le premier dragon (name,color)
local input1 = io.read()
-- Lire l'entrée pour le second dragon (name,color)
local input2 = io.read()
-- TODO: Analyser la première entrée pour extraire name et color
-- Indice: Utiliser string.match avec le motif "([^,]+),([^,]+)"
-- TODO: Analyser la seconde entrée pour extraire name et color
-- TODO: Créer le premier dragon avec son name et sa color
-- TODO: Créer le second dragon avec son name et sa color
-- TODO: Afficher ce qui suit dans l'ordre :
-- 1. Le name du premier dragon
-- 2. La color du premier dragon
-- 3. Le name du second dragon
-- 4. Couleur du second dragon
-- 5. Élément du premier dragon (partagé de la classe Dragon)
-- 6. Élément du second dragon (partagé de la classe Dragon)
-- 7. Monde du premier dragon (partagé de la classe Creature)
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
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 RectangleClasse CercleMéthode PérimètreCollection de formesAire totaleFiltrer les formes2Modè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 formesEntraînez-vous par vous-même : Compilateur Lua en ligne