Menu
Coddy logo textTech

Délégation

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

Stocker un objet à l’intérieur d’un autre objet n’est que la première étape. La véritable puissance de la composition vient de la délégation, lorsque l’objet externe transmet les appels de méthode à ses composants internes.

Pensez au démarrage d’une voiture. Vous ne passez pas sous le capot pour faire tourner le moteur manuellement. Vous tournez plutôt la clé, et la voiture s’occupe du reste en interne.

En code, cela signifie que la classe Car fournit une méthode simple :start() qui délègue le travail effectif au moteur :

function Car:start()
    print("Turning the key...")
    self.engine:run()  -- Déléguer à l'objet interne
end

La car n’a pas besoin de savoir comment le moteur fonctionne. Elle dit simplement au moteur de faire son travail. Cela permet de séparer les responsabilités. La classe Engine gère la logique du moteur, tandis que Car coordonne les éléments :

function Engine:run()
    print("Engine running at " .. self.horsepower .. " HP")
end

local engine = Engine:new(250)
local car = Car:new("Coupe", engine)
car:start()
-- Sortie :
-- Tourner la clé...
-- Moteur en marche à 250 HP

La délégation crée une interface claire pour les utilisateurs de votre classe. Ils interagissent avec la voiture, et non avec ses composants internes. Si vous remplacez ultérieurement le moteur par une autre implémentation, l’interface publique de la voiture reste la même : seule la délégation interne change.

challenge icon

Défi

Facile

Construisons un système de lecteur de musique qui illustre la délégation ! Vous allez créer un composant Speaker et un MusicPlayer qui le contient. Le lecteur ne gérera pas directement la sortie audio ; à la place, il délèguera cette responsabilité à son haut-parleur interne.

Vous organiserez votre code sur trois fichiers :

  • Speaker.lua : créez une classe Speaker avec un constructeur :new(volume) qui enregistre le niveau de volume. Incluez une méthode :playSound(trackName) qui affiche : Playing "{trackName}" at volume {volume}
  • MusicPlayer.lua : créez une classe MusicPlayer dont le constructeur :new(brand, speaker) accepte un nom de marque et un objet Speaker. Le lecteur stocke le haut-parleur en lui-même. Incluez ces méthodes :
    • :play(trackName) : affiche {brand} player starting..., puis délègue à la méthode :playSound() du haut-parleur
    • :stop() : affiche {brand} player stopped
  • main.lua : rassemblez tout ! Lisez les entrées correspondant au volume du haut-parleur, à la marque du lecteur et au nom d'une piste. Créez d'abord un Speaker, puis transmettez-le au constructeur de MusicPlayer. Appelez la méthode :play() du lecteur avec le nom de la piste, puis appelez :stop().

Vous recevrez trois entrées :

  1. Le volume du haut-parleur (un nombre)
  2. La marque du lecteur de musique (une chaîne de caractères)
  3. Le nom de la piste à lire (une chaîne de caractères)

Votre sortie doit montrer le lecteur en coordination avec son haut-parleur :

{brand} player starting...
Playing "{trackName}" at volume {volume}
{brand} player stopped

Par exemple, si les entrées sont 75, SoundMax et Summer Vibes, la sortie doit être :

SoundMax player starting...
Playing "Summer Vibes" at volume 75
SoundMax player stopped

Remarquez que MusicPlayer ne sait pas comment produire du son. Il demande simplement à son haut-parleur de s'en charger. C'est la délégation en action : l'objet externe fournit une interface claire, tandis que le composant interne effectue le travail spécialisé !

Essayez vous-même

-- main.lua
-- Rassembler tout !

local Speaker = require('Speaker')
local MusicPlayer = require('MusicPlayer')

-- Lire les entrées
local volume = tonumber(io.read())
local brand = io.read()
local trackName = io.read()

-- TODO: Créer un Speaker avec le volume donné

-- TODO: Créer un MusicPlayer avec le brand et le speaker

-- TODO: Appeler la méthode play du player avec le track name

-- TODO: Appeler la méthode stop du player
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