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:

Anuncios
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:

Anuncios
CuentaEspecial = Cuenta:nuevo()

Hasta aqui la nueva subclase es solo una instancia de Cuenta, lo monono viene ahora:

e = CuentaEspecial:nuevo{ limite = 1000.00 }
Anuncios

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:

Anuncios
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
Anuncios

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.

Anuncios

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