Menu
Coddy logo textTech

Relation 'A un'

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

Tout au long de ce cours, tu as utilisé l’héritage pour partager des comportements entre les classes : un Dog « est un » Animal. Mais l’héritage n’est pas toujours l’outil approprié.

Parfois, les objets ne partagent pas d’arbre généalogique ; au lieu de cela, un objet contient simplement un autre objet. C’est ce qu’on appelle la composition, et cela modélise une relation « a-un ».

Considère une voiture. Une voiture n’est pas un type de moteur. Elle possède un moteur. Le moteur est un objet distinct qui existe à l’intérieur de la voiture :

local Engine = {}
Engine.__index = Engine

function Engine:new(horsepower)
    local obj = {horsepower = horsepower}
    setmetatable(obj, Engine)
    return obj
end

local Car = {}
Car.__index = Car

function Car:new(model, engine)
    local obj = {
        model = model,
        engine = engine  -- Stocker l'objet Engine à l'intérieur de Car
    }
    setmetatable(obj, Car)
    return obj
end

Lors de la création d’une voiture, vous transmettez un objet moteur existant à son constructeur :

local myEngine = Engine:new(200)
local myCar = Car:new("Sedan", myEngine)

print(myCar.engine.horsepower)  -- 200

La voiture n’hérite pas du moteur. Elle contient simplement une référence à celui-ci. Cela permet de garder les deux classes indépendantes. Vous pourriez remplacer le moteur par un autre, ou utiliser la même classe de moteur dans une moto.

La composition vous offre une flexibilité que l’héritage ne peut pas offrir : vous assemblez des objets à partir de composants plutôt que de les enfermer dans une hiérarchie familiale rigide.

challenge icon

Défi

Facile

Construisons un système informatique en utilisant la composition ! Au lieu de l’héritage, tu vas créer un Computer qui contient un CPU : cela illustre la relation « possède-un ».

Tu vas organiser ton code sur trois fichiers :

  • CPU.lua : crée une classe CPU avec un constructeur :new(brand, speed) qui stocke le nom de la marque et la vitesse en GHz. Inclus une méthode :getInfo() qui renvoie une chaîne au format : {brand} @ {speed}GHz
  • Computer.lua : crée une classe Computer dont le constructeur :new(model, cpu) accepte un nom de modèle et un objet CPU. Computer stocke l’objet CPU en lui-même (composition !). Inclus une méthode :describe() qui affiche le modèle de l’ordinateur et les informations de son CPU.
  • main.lua : rassemble tout ! Lis les entrées correspondant à la marque du CPU, à la vitesse du CPU et au modèle de l’ordinateur. Crée d’abord un objet CPU, puis transmets-le au constructeur de Computer. Enfin, appelle la méthode :describe() de l’ordinateur.

Tu recevras trois entrées :

  1. La marque du CPU (une chaîne)
  2. La vitesse du CPU en GHz (un nombre)
  3. Le nom du modèle de l’ordinateur (une chaîne)

Ta sortie doit afficher la description de l’ordinateur, qui inclut les informations de son CPU contenu :

Model: {model}
CPU: {brand} @ {speed}GHz

Par exemple, si les entrées sont Intel, 3.5 et WorkStation, la sortie doit être :

Model: WorkStation
CPU: Intel @ 3.5GHz

Remarque que Computer n’hérite pas de CPU. Il conserve simplement une référence vers celui-ci. La méthode :describe() de Computer accède aux données du CPU par l’intermédiaire de l’objet stocké, montrant ainsi comment la composition permet de construire des objets complexes à partir de composants plus simples !

Essayez vous-même

-- main.lua
-- Rassembler tout en utilisant la composition

local CPU = require('CPU')
local Computer = require('Computer')

-- Lire les entrées
local cpuBrand = io.read()
local cpuSpeed = tonumber(io.read())
local computerModel = io.read()

-- TODO: Créer un objet CPU avec la marque et la vitesse

-- TODO: Créer un objet Computer avec le modèle et l'objet CPU

-- TODO: Appeler la méthode describe() de l'ordinateur pour afficher la sortie
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