0Pricing
Lua Academy · Aula

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
end

Criando 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 Woof

Cadeia 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)
end

Chamando 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
end

Ordem 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
end

Limites 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))  -- true

Có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

  1. Design de classe-base e construtor
  2. Herança em vários níveis
  3. Composição de mixins e verificações de interface
  4. instanceof e introspecção de tipos
← Voltar para Lua Academy