Menu
Coddy logo textTech

Mixin semplici

Fa parte della sezione Programmazione orientata agli oggetti del percorso Lua di Coddy. Lezione 51 di 70.

La composizione ti permette di inserire oggetti all'interno di altri oggetti. Ma cosa succede se vuoi condividere il comportamento tra classi non correlate?

Sia Player che MenuItem potrebbero aver bisogno di un metodo :describe(), ma non condividono una classe genitore. È qui che entrano in gioco i mixins.

Un mixin è semplicemente una tabella che contiene funzioni. Puoi "mescolare" queste funzioni in una classe copiandole al suo interno:

local Printable = {}

function Printable:describe()
    print("Object: " .. tostring(self))
end

function Printable:log(message)
    print("[LOG] " .. message)
end

Per applicare questo mixin a una classe, copi ogni funzione dalla tabella del mixin nella tabella della classe:

local function applyMixin(class, mixin)
    for key, value in pairs(mixin) do
        class[key] = value
    end
end

local Player = {}
Player.__index = Player

applyMixin(Player, Printable)  -- Ora Player ha :describe() e :log()

Dopo aver applicato il mixin, qualsiasi istanza di Player può chiamare quei metodi come se fossero definiti direttamente nella classe:

local p = setmetatable({}, Player)
p:log("Player created")  -- [LOG] Player created

A differenza dell’ereditarietà, i mixin non creano una relazione genitore-figlio. Stai semplicemente copiando funzioni da una tabella all’altra.

Questo rende i mixin perfetti per condividere comportamenti utili, come la registrazione dei log, la serializzazione o i metodi di descrizione, tra classi che altrimenti non avrebbero nulla in comune.

challenge icon

Sfida

Facile

Creiamo un sistema di tag usando i mixin! Creerai un mixin Taggable che può essere applicato a qualsiasi classe, dando agli oggetti la possibilità di gestire una raccolta di tag, utile per categorizzare elementi, post o qualsiasi entità che abbia bisogno di etichette.

Organizzerai il codice in tre file:

  • Taggable.lua: crea una tabella mixin contenente due metodi:
    • :addTag(tag): aggiunge un tag a self.tags (presuppone che la tabella esista)
    • :listTags(): stampa tutti i tag nel formato Tags: tag1, tag2, tag3 (o Tags: none se è vuota)
  • Article.lua: crea una classe Article con un costruttore :new(title) che memorizza il titolo e inizializza una tabella tags vuota. Applica il mixin Taggable per fornire alle istanze di Article la capacità di gestire i tag. Includi un metodo :getTitle() che restituisce il titolo dell'articolo.
  • main.lua: scrivi qui la funzione helper applyMixin (la userai in Article.lua tramite require). Poi leggi gli input per il titolo di un articolo e due tag. Crea un Article, aggiungi entrambi i tag, stampa il titolo ed elenca tutti i tag.

Riceverai tre input:

  1. Il titolo dell'articolo (una stringa)
  2. Il primo tag da aggiungere (una stringa)
  3. Il secondo tag da aggiungere (una stringa)

L'output dovrà mostrare il titolo dell'articolo seguito dai suoi tag:

Title: {title}
Tags: {tag1}, {tag2}

Per esempio, se gli input sono Lua Basics, programming e tutorial, l'output dovrà essere:

Title: Lua Basics
Tags: programming, tutorial

Ricorda: i metodi del mixin funzionano perché le istanze di Article hanno una tabella tags su cui i metodi del mixin possono operare. Il mixin non crea questa tabella. È il costruttore di Article a farlo. Il mixin fornisce solo il comportamento condiviso!

Provalo tu

-- File principale del sistema di etichettatura
local Taggable = require('Taggable')
local Article = require('Article')

-- TODO: Implementare la funzione applyMixin
-- Questa funzione deve copiare tutti i metodi da una tabella mixin a una tabella di destinazione
function applyMixin(target, mixin)
    -- TODO: Scorrere mixin e copiare ogni metodo in target
end

-- Leggere gli input
local title = io.read()
local tag1 = io.read()
local tag2 = io.read()

-- TODO: Creare un Article con il titolo fornito

-- TODO: Aggiungere entrambe le etichette all'articolo

-- TODO: Stampare il titolo nel formato: Title: {title}

-- TODO: Elencare tutte le etichette usando il metodo listTags
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Lua online