Menu
Coddy logo textTech

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

Le 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 Poodle

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

challenge icon

Défi

Facile

Construisons 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 classe Person avec 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 old

Vous recevrez deux entrées :

  1. Le nom de la personne
  2. 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 old

Aide-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)
end

Cré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 Poodle

Chaque 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
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 Object Oriented Programming