Menu
Coddy logo textTech

Variables d'instance

Fait partie de la section Programmation orientée objet du Journey Lua de Coddy. Leçon 12 sur 70.

Bienvenue dans un nouveau chapitre consacré à la manière dont les objets gèrent leurs données internes. Tu as appris à créer des classes et des instances : il est maintenant temps d’explorer comment chaque instance stocke et gère son propre état unique.

Les variables d’instance sont des champs qui appartiennent exclusivement à un seul objet. Lorsque vous affectez une valeur à self.something dans une méthode ou un constructeur, ces données n’existent que dans cette instance particulière. Les autres objets de la même classe possèdent leurs propres copies distinctes.

Cela devient particulièrement important lorsqu’on stocke des données complexes comme des tableaux. Considérons un système d’inventaire où chaque personnage transporte différents objets :

local Inventory = {}
Inventory.__index = Inventory

function Inventory:new()
    local instance = {}
    setmetatable(instance, self)
    instance.items = {}  -- Chaque instance obtient sa propre table vide
    return instance
end

function Inventory:addItem(item)
    table.insert(self.items, item)
end

La ligne clé est instance.items = {}. En créant une nouvelle table vide dans le constructeur, chaque objet d’inventaire reçoit sa propre liste distincte. Si tu définissais plutôt items directement dans la table de la classe, toutes les instances partageraient accidentellement la même table : ajouter une épée à un personnage la donnerait à tout le monde !

local bag1 = Inventory:new()
local bag2 = Inventory:new()

bag1:addItem("Sword")
bag2:addItem("Potion")

print(#bag1.items)  -- Sortie : 1
print(#bag2.items)  -- Sortie : 1

Chaque inventaire conserve sa propre collection. Ce modèle s’applique chaque fois qu’une instance doit suivre des données qui évoluent indépendamment : des listes, des compteurs ou tout état mutable propre à cet objet.

challenge icon

Défi

Facile

Construisons un système de ShoppingCart où chaque panier conserve sa propre liste distincte de produits. Cela montrera comment les variables d’instance isolent les données entre les objets : ajouter des articles à un panier n’affectera pas l’autre !

Vous organiserez votre code sur deux fichiers :

  • ShoppingCart.lua : définissez votre classe ShoppingCart, où chaque instance possède sa propre table products. Incluez :
    • Un constructeur :new() qui initialise une liste de produits vide pour chaque panier
    • Une méthode :addProduct(productName) qui ajoute un produit à la liste de ce panier
    • Une méthode :listProducts() qui affiche chaque produit sur une ligne distincte
  • main.lua : importez votre module ShoppingCart et créez deux paniers distincts. Ajoutez des produits différents à chaque panier pour prouver qu’ils conservent des inventaires indépendants.

Vous recevrez quatre entrées :

  1. Premier produit à ajouter au panier A
  2. Deuxième produit à ajouter au panier A
  3. Premier produit à ajouter au panier B
  4. Deuxième produit à ajouter au panier B

Dans votre fichier principal :

  1. Créez deux paniers : cartA et cartB
  2. Ajoutez les deux premiers produits à cartA
  3. Ajoutez les deux derniers produits à cartB
  4. Affichez Cart A:, puis listez les produits du panier A
  5. Affichez Cart B:, puis listez les produits du panier B

Par exemple, si les entrées sont Apple, Bread, Milk et Eggs, la sortie devrait être :

Cart A:
Apple
Bread
Cart B:
Milk
Eggs

Souvenez-vous : l’essentiel est d’initialiser products comme une nouvelle table vide à l’intérieur du constructeur. Cela garantit que chaque instance du panier possède sa propre liste distincte, au lieu de partager une seule table entre tous les paniers.

Essayez vous-même

-- Requiert le module ShoppingCart
local ShoppingCart = require('ShoppingCart')

-- Lire les entrées
local product1 = io.read()
local product2 = io.read()
local product3 = io.read()
local product4 = io.read()

-- TODO: Créer deux paniers d'achat : cartA et cartB

-- TODO: Ajouter product1 et product2 à cartA

-- TODO: Ajouter product3 et product4 à cartB

-- TODO: Afficher "Cart A:" puis lister les produits de cartA

-- TODO: Afficher "Cart B:" puis lister les produits de cartB
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