0Pricing
Lua Academy · Aula

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
end

Definindo 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 Meow

Padrã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"
end

Mé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)  -- 1

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

Metamé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
end

Por 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

  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