Design de classe-base e construtor
Projete uma fábrica Class() que configure metatabelas e construtores new().
Design de classe-base e construtor é uma aula grátis de Lua Academy no CoddyKit. Esta é a aula 1 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.
Objetivo: uma fábrica de classes reutilizável
Queremos uma função Class() que retorne um novo objeto de classe com construtor adequado, localização de métodos e semântica de orientação a objetos.
Esqueleto da fábrica de classes
A fábrica cria uma tabela de classe com uma metatabela para o despacho de métodos.
local function Class()
local cls = {}
cls.__index = cls
cls.__name = "AnonymousClass"
function cls:new(...)
local instance = setmetatable({}, cls)
if instance.init then instance:init(...) end
return instance
end
return cls
endDefinindo uma classe
Crie uma classe, defina init (o construtor) e adicione métodos.
local Animal = Class()
Animal.__name = "Animal"
function Animal:init(name, sound)
self.name = name
self.sound = sound
end
function Animal:speak()
print(self.name .. " says " .. self.sound)
end
local cat = Animal:new("Cat", "Meow")
cat:speak() -- Cat says MeowPadrão do construtor
O construtor :new(...) cria uma instância por meio de setmetatable({}, cls) e depois chama :init(...) para inicializá-la. Isso separa a alocação da inicialização.
Nome da classe para depuração
Armazene cls.__name e defina __tostring para que as instâncias sejam exibidas de forma significativa.
function Animal:__tostring()
return "<" .. Animal.__name .. ": " .. self.name .. ">"
end
print(tostring(cat)) -- <Animal: Cat>Valores padrão em init
Forneça valores padrão em init usando or.
function Vehicle:init(opts)
self.speed = opts.speed or 0
self.fuel = opts.fuel or 100
self.engine = opts.engine or "petrol"
endMétodos de classe versus métodos de instância
Os métodos definidos com function cls.method() são métodos de classe (sem self). Os métodos definidos com function cls:method() recebem a instância como self.
Propriedades estáticas
As propriedades definidas diretamente na tabela de classe são compartilhadas por todas as instâncias, a menos que sejam ocultadas por campos da instância.
Animal.count = 0
function Animal:init(name, sound)
Animal.count = Animal.count + 1
self.name = name; self.sound = sound
end
print(Animal.count) -- 0
Animal:new("Dog","Woof")
print(Animal.count) -- 1Construtor de cópia
Um método :clone() cria uma cópia de uma instância copiando superficialmente seus campos.
function Animal:clone()
local copy = setmetatable({}, getmetatable(self))
for k, v in pairs(self) do copy[k] = v end
return copy
endMetamétodo de igualdade
Defina __eq para obter comparações de igualdade significativas entre instâncias.
Animal.__eq = function(a, b)
return a.name == b.name
endPor que não usar rawget?
Use self.field (não rawget) para permitir o acesso a campos baseado em metamétodos nas classes derivadas. Use rawget somente quando for necessário ignorar explicitamente esse mecanismo.
Pergunta sobre o projeto do construtor
Por que init é chamado separadamente do alocador new?
Recapitulação: classe base e construtor
Uma fábrica Class() cria uma tabela como classe, define __index = cls para localizar métodos e fornece :new() + :init(). Essa é a base de todos os padrões de orientação a objetos em Lua.
Perguntas Frequentes
A aula “Design de classe-base e construtor” é grátis?
Sim — o texto completo de “Design de classe-base e construtor” é 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 “Design de classe-base e construtor”?
Projete uma fábrica Class() que configure metatabelas e construtores new(). 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 1 de 4.
Quanto tempo leva a aula “Design de classe-base e construtor”?
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