2007-02-23

Herança múltipla em Lua

Lua Ficou faltando um exemplo de herança múltipla em Lua no artigo de orientação a objetos, né?

Vamos ver algo bem simples...

Você mesmo pode criar um mecanismo para lidar com redundância. No entanto, para manter este artigo o mais simples – e inteligível – possível, vou ignorar deliberadamente problemas desse tipo.


A idéia é que a função na chave __index da metatabela procure a chave em cada uma das classes pai, retornando a primeira ocorrência que encontrar.

Podemos colocar a lista de classes pai em outra chave da metatabela.

Digamos que queremos criar uma classe Button, herdeira de Shape e de EventResponser (só usei os nomes em inglês porque em português ficariam muito grandes). =P
Button = {
super = { Shape, EventResponser }
}

Button.__index = function (t, k)
local class
for _, class in ipairs(Button.super) do
if class[k] then return class[k] end
end
end


Assim que a chave for encontrada em uma das classes (ele deve procurar primeiro em Shape), o valor será encontrado.

Para podermos usar polimorfismo e acrescentar novos métodos a esta classe, teremos de mudar um pouco mais a função para procurar a chave primeiro na própria classe:
Button.__index = function (t, k)
if Button[k] then return Button[k] end
local class
for _, class in ipairs(Button.super) do
if class[k] then return class[k] end
end
end


Valeu a brincadeira?

[]'s