Programare Orientată pe Obiecte (OOP) bazată pe Prototipuri în Lua în Lua

Ghid complet pentru OOP în Lua: crearea claselor cu constructori, delegarea prin __index, operatorul colon ':' și implementarea moștenirii între clase.

Sintaxă
ContBancar = {}; ContBancar.__index = ContBancar; function ContBancar:new(...)

Lua implementează paradigma Object-Oriented Programming (OOP) bazată pe prototipuri (similară cu JavaScript înainte de ES6). Nu există un cuvânt-cheie class; în schimb, o clasă este o tabelă care servește drept prototip și conține metodele, iar noile instanțe își deleagă căutarea membrilor către această tabelă prin __index.

Clasa ContBancar cu depunere, retragere și moștenire
-- 1. Definirea clasei părinte:
local ContBancar = {}
ContBancar.__index = ContBancar

-- Constructorul:
function ContBancar:new(titular, soldInitial)
    local instanta = {
        titular = titular or "Anonim",
        sold = soldInitial or 0
    }
    setmetatable(instanta, self)
    return instanta
end

-- Metode ale clasei (operatorul ':' injectează automat 'self'):
function ContBancar:depune(suma)
    self.sold = self.sold + suma
    print(string.format("[%s] Depunere: +%d lei. Sold curent: %d lei.", self.titular, suma, self.sold))
end

function ContBancar:retrage(suma)
    if self.sold >= suma then
        self.sold = self.sold - suma
        print(string.format("[%s] Retragere: -%d lei. Sold rămas: %d lei.", self.titular, suma, self.sold))
        return true
    else
        print(string.format("[%s] Fonduri insuficiente!", self.titular))
        return false
    end
end

-- 2. Utilizare practică:
local contAndrei = ContBancar:new("Andrei Popescu", 500)
contAndrei:depune(250)
contAndrei:retrage(100)