Menu
Coddy logo textTech

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
end
local 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
end

Lorsque 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.

challenge icon

Défi

Facile

Explorons 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 classe world = "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 classe element = "fire" que tous les dragons partagent. Ton constructeur :new(name, color) doit appeler le constructeur parent pour le nom, puis ajouter color comme 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 :

  1. Le nom et la couleur du premier dragon, séparés par une virgule (par exemple : Smaug,red)
  2. 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 :

  1. Le name du premier dragon
  2. Le color du premier dragon
  3. Le name du deuxième dragon
  4. Le color du deuxième dragon
  5. Le element du premier dragon (partagé depuis la classe Dragon)
  6. Le element du deuxième dragon (partagé depuis la classe Dragon)
  7. Le world du 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 Realm

Remarque 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)
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 : Compilateur Lua en ligne