Herança em vários níveis
Dê suporte a cadeias profundas de herança com delegação adequada de __index.
Herança em vários níveis é uma aula grátis de Lua Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Lua Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Lua Academy inclui 4 aulas no total.
Revisão da herança simples
A herança simples é obtida definindo Child.__index = Parent. Busca de métodos: se não estiver em Child, procure em Parent por meio de __index.
Estendendo a fábrica de classes para herança
Adicione um método :extend() à classe base para criar uma subclasse vinculada à classe pai.
function Animal:extend()
local cls = {}
cls.__index = cls
setmetatable(cls, {__index = self})
cls.super = self
function cls:new(...)
local inst = setmetatable({}, cls)
if inst.init then inst:init(...) end
return inst
end
return cls
endCriando uma subclasse
Crie Dog como uma subclasse de Animal, substituindo init e adicionando novos métodos.
local Dog = Animal:extend()
function Dog:init(name)
Dog.super.init(self, name, "Woof")
self.tricks = {}
end
function Dog:learnTrick(trick)
self.tricks[#self.tricks+1] = trick
end
local d = Dog:new("Rex")
d:learnTrick("sit")
d:speak() -- Rex says WoofCadeia de vários níveis
Estenda Dog para criar GuideDog — uma cadeia de herança de três níveis.
local GuideDog = Dog:extend()
function GuideDog:init(name, owner)
GuideDog.super.init(self, name)
self.owner = owner
end
function GuideDog:guide()
print(self.name .. " guides " .. self.owner)
endChamando métodos da superclasse
Chame sempre a superclasse por meio da referência de classe, não por meio de self, para evitar recursão infinita.
function Dog:init(name)
Dog.super.init(self, name, "Woof") -- explicit super call
endOrdem de resolução de métodos
Lua resolve métodos de baixo para cima por meio das cadeias de __index. GuideDog → Dog → Animal → nil. O primeiro encontrado vence.
Substituindo métodos
Defina um método com o mesmo nome na subclasse para substituí-lo. Chame a superclasse explicitamente para substituições parciais.
function Dog:speak()
print(self.name .. " barks!")
Dog.super.speak(self) -- also call parent speak
endLimites de profundidade
Cadeias de herança muito profundas tornam mais lenta a localização de métodos (cada nível adiciona uma etapa de __index). Prefira composição quando houver mais de 3 ou 4 níveis.
Verificando pertencimento à classe
Percorra a cadeia de metatabelas para verificar se uma instância pertence a uma classe.
local function isA(instance, cls)
local mt = getmetatable(instance)
while mt do
if mt == cls then return true end
mt = getmetatable(mt)
end
return false
end
print(isA(d, Dog)) -- true
print(isA(d, Animal)) -- trueCópia profunda preservando a classe
Ao copiar instâncias profundamente, preserve a metatabela para que a cópia continue sendo uma instância da classe correta.
Quando preferir composição
Use herança para relações verdadeiras de tipo é-um (Dog é um Animal). Use composição (tabelas de componentes) para relações de tipo tem-um ou para combinar comportamentos de forma flexível.
Pergunta sobre herança
Como funciona a herança de vários níveis em Lua?
Recapitulação: herança de vários níveis
Estenda a fábrica de classes com um método :extend() que encadeie links de __index. Chame a superclasse explicitamente com ClassName.super.method(self, ...). Verifique o pertencimento percorrendo a cadeia de metatabelas.
Perguntas Frequentes
A aula “Herança em vários níveis” é grátis?
Sim — o texto completo de “Herança em vários níveis” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Lua Academy, atualize para CoddyKit PRO. O curso de Lua Academy inclui 4 aulas no total.
O que vou aprender em “Herança em vários níveis”?
Dê suporte a cadeias profundas de herança com delegação adequada de __index. Você pratica Lua Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Lua Academy?
Nenhuma experiência prévia é necessária. Lua Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Herança em vários níveis”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Lua Academy?
Sim. Cada aula de Lua Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Design de classe-base e construtor
- Herança em vários níveis
- Composição de mixins e verificações de interface
- instanceof e introspecção de tipos