Herança múltipla em 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). =PButton = {
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