Bienvenidos sean a este post, como hablamos en el post anterior las clases son elementos que pueden conseguir metodos desde otras clases tambien, esta conducta se convierte en herencia (en el significado usual orientado a objetos) y la hace facil para implemetar en Lua, vamos a asumir que tenemos una clase base como Cuenta:
Cuenta = { balance = 0 }
function Cuenta:nuevo(o)
o = o or {}
setmetatable(o, self)
self.__index = self
return o
end
function Cuenta:depositar(v)
self.balance = self.balance + v
end
function Cuenta:retirar(v)
if v > self.balance then error"fondos insuficientes" end
self.balance = self.balance - v
end
De esta clase queremos derivar una subclase llamada CuentaEspecial que le permite retirar al cliente mas que su balance, comenzaremos con una clase vacia que simplemente hereda todas las operaciones de la clase base:
CuentaEspecial = Cuenta:nuevo()
Hasta aqui la nueva subclase es solo una instancia de Cuenta, lo monono viene ahora:
e = CuentaEspecial:nuevo{ limite = 1000.00 }
CuentaEspecial hereda a nuevo como cualquier otro metodo pero esta vez cuando nuevo se ejecuta, el parametro self referira a CuentaEspecial por lo tanto la metatabla e sera CuentaEspecial cuyo valor en el campo __index es tambien CuentaEspecial asi que e hereda de CuentaEspecial y a su vez hereda de Cuenta, veamos cuando lo usamos:
s:depositar(100.00)
Como Lua no puede encontrar un campo depositar en e asi que mira dentro de CuentaEspecial donde tampoco encuentra un campo depositar entonces mira dentro de Cuenta donde encuentra la implementacion original para depositar pero lo que hace especial a CuentaEspecial es que podemos redefinir cualquier metodo de la superclase, es el nombre que se le asigna a la clase base, y todo lo que necesitamos hacer es escribir el nuevo metodo:
function CuentaEspecial:retirar(v)
if v - self.balance >= self:obtlimite() then
error"fondos insuficientes"
end
self.balance = self.balance - v
end
function CuentaEspecial:obtlimite()
return self.limite or 0
end
A partir de ahora cuando llamemos a:
e:retirar(200.0)
Lua no va a Cuenta porque antes encuentra al nuevo metodo retirar en CuentaEspecial como e.limite tiene un valor de 1000.00, recuerden que lo declaramos cuando creamos a e, el programa procede a hacer el retiro dejando a s con un balance negativo.
Un aspecto interesante de objetos en Lua es que no necesitas crear una nueva clase para especificar una nueva conducta, si solo un unico objeto necesita una conducta especifica puedes implementar dicha conducta directamente en el objeto, por ejemplo si la cuenta e representa algun cliente especial que cuyo limite es siempre el 10% de su balance se puede modificar solo esta cuenta:
function e:obtlimite()
return self.balance = 0.10
end
Despues de esta declaracion la llamada a e:retirar(200.00) ejecuta el metodo retirar de CuentaEspecial pero cuando retirar llama a self.obtlimite en realidad llama a esta ultima modificacion.
En resumen, hoy hemos visto que es herencia en Lua, algunos conceptos basicos de otros lenguajes, como trabaja en Lua, como hereda de la superclase, como podemos modificar nuestros metodos en la subclase, espero les haya sido util sigueme en Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.
Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar
Es para mantenimiento del sitio, gracias!
$1.00