La programació orientada a objectes (OOP) és un paradigma de programació que utilitza "objectes" per representar dades i mètodes. Lua no té suport natiu per a OOP com altres llenguatges com Java o Python, però proporciona mecanismes flexibles que permeten implementar OOP de manera eficient.

Conceptes Clau

  1. Objectes: Entitats que encapsulen dades i comportaments.
  2. Classes: Plantilles per crear objectes.
  3. Metataules: Taules especials que defineixen el comportament de les taules.
  4. Metamètodes: Funcions especials dins de les metataules que defineixen com es comporten les operacions en les taules.

Creació d'Objectes i Classes

Definició d'una Classe

En Lua, una classe es pot definir utilitzant taules i metataules. Aquí tens un exemple bàsic d'una classe Persona:

-- Definició de la classe Persona
Persona = {}
Persona.__index = Persona

-- Constructor
function Persona:new(nom, edat)
    local self = setmetatable({}, Persona)
    self.nom = nom
    self.edat = edat
    return self
end

-- Mètode per mostrar informació
function Persona:mostrarInformacio()
    print("Nom: " .. self.nom .. ", Edat: " .. self.edat)
end

Creació d'Objectes

Per crear un objecte de la classe Persona, utilitzem el constructor new:

-- Creació d'un objecte Persona
local persona1 = Persona:new("Joan", 30)
persona1:mostrarInformacio()  -- Sortida: Nom: Joan, Edat: 30

Herència

L'herència permet que una classe (subclasse) hereti propietats i mètodes d'una altra classe (superclasse).

Definició d'una Subclasse

Aquí tens un exemple d'una subclasse Estudiant que hereta de Persona:

-- Definició de la classe Estudiant
Estudiant = setmetatable({}, {__index = Persona})
Estudiant.__index = Estudiant

-- Constructor
function Estudiant:new(nom, edat, curs)
    local self = Persona.new(self, nom, edat)
    setmetatable(self, Estudiant)
    self.curs = curs
    return self
end

-- Mètode per mostrar informació
function Estudiant:mostrarInformacio()
    Persona.mostrarInformacio(self)
    print("Curs: " .. self.curs)
end

Creació d'Objectes de la Subclasse

-- Creació d'un objecte Estudiant
local estudiant1 = Estudiant:new("Anna", 22, "Informàtica")
estudiant1:mostrarInformacio()
-- Sortida:
-- Nom: Anna, Edat: 22
-- Curs: Informàtica

Exercicis Pràctics

Exercici 1: Crear una Classe Cotxe

  1. Defineix una classe Cotxe amb propietats marca i model.
  2. Afegeix un mètode mostrarInformacio que imprimeixi la marca i el model del cotxe.
  3. Crea un objecte de la classe Cotxe i crida el mètode mostrarInformacio.

Solució

-- Definició de la classe Cotxe
Cotxe = {}
Cotxe.__index = Cotxe

-- Constructor
function Cotxe:new(marca, model)
    local self = setmetatable({}, Cotxe)
    self.marca = marca
    self.model = model
    return self
end

-- Mètode per mostrar informació
function Cotxe:mostrarInformacio()
    print("Marca: " .. self.marca .. ", Model: " .. self.model)
end

-- Creació d'un objecte Cotxe
local cotxe1 = Cotxe:new("Toyota", "Corolla")
cotxe1:mostrarInformacio()  -- Sortida: Marca: Toyota, Model: Corolla

Exercici 2: Crear una Subclasse CotxeElèctric

  1. Defineix una subclasse CotxeElèctric que hereti de Cotxe.
  2. Afegeix una propietat autonomia.
  3. Modifica el mètode mostrarInformacio per incloure la informació de l'autonomia.
  4. Crea un objecte de la subclasse CotxeElèctric i crida el mètode mostrarInformacio.

Solució

-- Definició de la classe CotxeElèctric
CotxeElèctric = setmetatable({}, {__index = Cotxe})
CotxeElèctric.__index = CotxeElèctric

-- Constructor
function CotxeElèctric:new(marca, model, autonomia)
    local self = Cotxe.new(self, marca, model)
    setmetatable(self, CotxeElèctric)
    self.autonomia = autonomia
    return self
end

-- Mètode per mostrar informació
function CotxeElèctric:mostrarInformacio()
    Cotxe.mostrarInformacio(self)
    print("Autonomia: " .. self.autonomia .. " km")
end

-- Creació d'un objecte CotxeElèctric
local cotxeElèctric1 = CotxeElèctric:new("Tesla", "Model S", 600)
cotxeElèctric1:mostrarInformacio()
-- Sortida:
-- Marca: Tesla, Model: Model S
-- Autonomia: 600 km

Resum

En aquesta secció, hem après com implementar la programació orientada a objectes en Lua utilitzant taules i metataules. Hem vist com definir classes, crear objectes, implementar herència i afegir mètodes. A més, hem practicat aquests conceptes amb exercicis pràctics. Amb aquests coneixements, estàs preparat per aplicar OOP en els teus projectes Lua i crear codi més organitzat i reutilitzable.

© Copyright 2024. Tots els drets reservats