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)
endLa 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 : 1Chaque 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.
Défi
FacileConstruisons 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 classeShoppingCart, où chaque instance possède sa propre tableproducts. 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
- Un constructeur
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 :
- Premier produit à ajouter au panier A
- Deuxième produit à ajouter au panier A
- Premier produit à ajouter au panier B
- Deuxième produit à ajouter au panier B
Dans votre fichier principal :
- Créez deux paniers :
cartAetcartB - Ajoutez les deux premiers produits à
cartA - Ajoutez les deux derniers produits à
cartB - Affichez
Cart A:, puis listez les produits du panier A - 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
EggsSouvenez-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
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