O Construtor :new()
Parte da seção Object Oriented Programming do Journey de Lua da Coddy — lição 8 de 70.
Criar objetos manualmente—criar uma tabela vazia, configurar sua metatabela, vincular __index—torna-se repetitivo. A solução padrão é definir um método construtor :new() diretamente na classe que lida com tudo isso para você.
Aqui está o padrão:
local Dog = {}
Dog.__index = Dog
function Dog:new()
local instance = {}
setmetatable(instance, self)
return instance
end
function Dog:bark()
print("Woof!")
endVamos analisar o que acontece dentro de :new(). Primeiro, criamos uma tabela vazia chamada instance. Depois, definimos seu metatable como self—que é Dog quando chamamos Dog:new().
Como Dog.__index aponta para Dog em si, a instância pode encontrar todos os métodos definidos em Dog. Finalmente, retornamos o novo objeto.
Observe a linha Dog.__index = Dog fora do construtor. Este é um atalho comum — em vez de criar uma metatabela separada, a tabela da classe serve tanto como o protótipo quanto como a metatabela.
Agora a criação de objetos é limpa e consistente:
local myDog = Dog:new()
myDog:bark() -- Saída: Woof!Cada classe que você criar seguirá esta mesma estrutura. O construtor :new() torna-se o único lugar onde a criação de objetos acontece, tornando seu código organizado e previsível.
Desafio
FácilVamos construir uma classe Cat usando o padrão de construtor padrão que você acabou de aprender. Você organizará seu código em dois arquivos para praticar a estrutura adequada de módulos.
Você criará:
Cat.lua: Defina sua classeCatcom o padrão de construtor completo. Sua classe deve incluir:- A tabela da classe com
__indexapontando para si mesma - Um construtor
:new()que cria uma instância, define seu metatable e a retorna - Um método
:meow()que imprime o som do gato
- A tabela da classe com
main.lua: Importe seu módulo Cat e use o construtor para criar uma instância de gato. Em seguida, chame seu método para verificar se tudo está vinculado corretamente.
Você receberá uma entrada: o número de vezes que seu gato deve miar.
Seu método :meow() deve imprimir exatamente:
Meow!No seu arquivo principal, crie um gato usando Cat:new() e chame :meow() o número de vezes especificado.
Por exemplo, se a entrada for 3, a saída deve ser:
Meow!
Meow!
Meow!Folha de consulta
Para criar uma classe com um construtor em Lua, defina um método :new() que cria instâncias:
local ClassName = {}
ClassName.__index = ClassName
function ClassName:new()
local instance = {}
setmetatable(instance, self)
return instance
end
function ClassName:method()
-- implementação do método
endO campo __index aponta para a própria classe, permitindo que as instâncias acessem métodos definidos na tabela da classe.
Dentro de :new():
- Crie uma tabela vazia para a instância
- Defina seu metatable como
self(a classe) - Retorne a nova instância
Crie objetos usando o construtor:
local obj = ClassName:new()
obj:method()Experimente você mesmo
-- Requer o módulo Cat
local Cat = require('Cat')
-- Lê a entrada: número de vezes para miar
local times = tonumber(io.read())
-- TODO: Criar uma instância de gato usando Cat:new()
-- TODO: Chamar o método :meow() o número especificado de vezes
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Object Oriented Programming
1O Conceito 'Self'
Tabelas com Funções'self' ExplícitoA Sintaxe de Dois-pontosPonto vs Dois-pontosRecapitulação - Movendo o Ponto4Projeto: Banco Digital
Configuração do ProjetoMétodo de Depósito7Polimorfismo e Sobrescrita
Sobrescrita de MétodosChamando Métodos da Classe PaiDuck TypingInterface ComumVerificando o TipoRecapitulação - Papéis de Funcionários10Projeto: Gerenciador de Formas
Configuração do ProjetoClasse Retângulo2Padrão de Protótipo de Classe
O Conceito de ProtótipoVinculando com __indexO Construtor :new()Inicializando AtributosInstâncias IndependentesRecapitulação - Fábrica de Carros5Sobrecarga de Operadores em POO
Somando ObjetosSubtraindo ObjetosConcatenando ObjetosComparando Objetos (<, >)Recapitulação - Matemática de Carteira8Encapsulamento
Convenções de NomenclaturaClosures para PrivacidadeAcesso via ClosuresTabelas Somente LeituraLógica de ValidaçãoRecapitulação - Cofre Seguro11Padrões de Projeto (Lite)
Funções FactoryTabela SingletonPadrão IteratorObserver (Listener)Recapitulação - Logger Factory3Estado e Comportamento do Objeto
Variáveis de InstânciaMétodos GetterMétodos SetterPropriedades CalculadasFormatação de StringsVerificações de IgualdadeRecapitulação - Nota do Aluno6Fundamentos de Herança
Configurando a HerançaHerdando MétodosEstendendo o ConstrutorAdicionando Métodos FilhosCompartilhado vs ÚnicoRecapitulação - Hierarquia de Formas