Initialisation des attributs
Fait partie de la section Object Oriented Programming du Journey Lua de Coddy — leçon 9 sur 70.
Le constructeur :new() que vous avez appris crée des objets, mais chaque instance commence de manière identique. Les objets réels ont besoin de données uniques — une personne a un nom spécifique, un joueur a un score de départ. Pour rendre les objets utiles, le constructeur doit accepter des arguments et les assigner à la nouvelle instance.
Voici comment étendre le constructeur pour accepter des valeurs initiales :
local Dog = {}
Dog.__index = Dog
function Dog:new(name, breed)
local instance = {}
setmetatable(instance, self)
instance.name = name
instance.breed = breed
return instance
end
function Dog:introduce()
print("I am " .. self.name .. ", a " .. self.breed)
endLe constructeur prend désormais name et breed comme paramètres. Après avoir créé l'instance vide et défini sa métatable, nous assignons ces valeurs directement aux champs de l'instance. Chaque objet créé aura ses propres name et breed.
local dog1 = Dog:new("Rex", "German Shepherd")
local dog2 = Dog:new("Bella", "Poodle")
dog1:introduce() -- Résultat : Je suis Rex, un German Shepherd
dog2:introduce() -- Résultat : Je suis Bella, un PoodleLes deux chiens partagent la même méthode :introduce() du prototype, mais chacun possède son propre nom et sa propre race stockés dans sa table d'instance. C'est là toute la puissance de la combinaison des prototypes avec des constructeurs paramétrés : un comportement partagé avec un état individuel.
Défi
FacileConstruisons une classe Person qui crée des individus uniques avec leurs propres noms et âges. Vous organiserez votre code sur deux fichiers pour pratiquer une structure de module appropriée.
Vous allez créer :
Person.lua: Définissez votre classePersonavec un constructeur qui accepte un nom et un âge. Incluez une méthode:introduce()qui permet à chaque personne de se présenter.main.lua: Importez votre module Person et créez une instance de personne en utilisant les entrées fournies. Ensuite, demandez-leur de se présenter.
Votre constructeur :new(name, age) doit accepter les deux valeurs et les stocker sur la nouvelle instance. La méthode :introduce() doit imprimer exactement dans ce format :
Hello, my name is [name] and I am [age] years oldVous recevrez deux entrées :
- Le nom de la personne
- L'âge de la personne
Par exemple, si les entrées sont Alice et 25, la sortie devrait être :
Hello, my name is Alice and I am 25 years oldAide-mémoire
Pour créer des objets avec des données uniques, étendez le constructeur :new() pour accepter des paramètres et les assigner à l'instance :
local Dog = {}
Dog.__index = Dog
function Dog:new(name, breed)
local instance = {}
setmetatable(instance, self)
instance.name = name
instance.breed = breed
return instance
end
function Dog:introduce()
print("I am " .. self.name .. ", a " .. self.breed)
endCréez des instances avec des valeurs différentes :
local dog1 = Dog:new("Rex", "German Shepherd")
local dog2 = Dog:new("Bella", "Poodle")
dog1:introduce() -- Résultat : I am Rex, a German Shepherd
dog2:introduce() -- Résultat : I am Bella, a PoodleChaque objet possède ses propres données uniques stockées dans sa table d'instance, tout en partageant les méthodes du prototype.
Essayez vous-même
-- Requiert le module Person
local Person = require('Person')
-- Lire l'entrée
local name = io.read()
local age = io.read()
-- TODO: Créer une nouvelle instance de Person en utilisant Person:new(name, age)
-- TODO: Appeler la méthode introduce() sur votre instance de person
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