Inicializando Atributos
Parte da seção Object Oriented Programming do Journey de Lua da Coddy — lição 9 de 70.
O construtor :new() que você aprendeu cria objetos, mas cada instância começa idêntica. Objetos reais precisam de dados únicos — uma pessoa tem um nome específico, um jogador tem uma pontuação inicial. Para tornar os objetos úteis, o construtor deve aceitar argumentos e atribuí-los à nova instância.
Veja como expandir o construtor para aceitar valores iniciais:
local Dog = {}
Dog.__index = Dog
function Dog:new(name, breed)
local instance = {}
setmetatable(instance, self)
instance.name = name
instance.breed = breed
return instance
end
function Dog:introduce()
print("I am " .. self.name .. ", a " .. self.breed)
endO construtor agora recebe name e breed como parâmetros. Após criar a instância vazia e definir sua metatabela, atribuímos esses valores diretamente aos campos da instância. Cada objeto criado terá seu próprio name e breed.
local dog1 = Dog:new("Rex", "German Shepherd")
local dog2 = Dog:new("Bella", "Poodle")
dog1:introduce() -- Saída: Eu sou Rex, um Pastor Alemão
dog2:introduce() -- Saída: Eu sou Bella, um PoodleAmbos os cães compartilham o mesmo método :introduce() do protótipo, mas cada um possui seu próprio nome e raça exclusivos armazenados em sua tabela de instância. Este é o poder de combinar protótipos com construtores parametrizados — comportamento compartilhado com estado individual.
Desafio
FácilVamos construir uma classe Person que cria indivíduos únicos com seus próprios nomes e idades. Você organizará seu código em dois arquivos para praticar a estrutura adequada de módulos.
Você criará:
Person.lua: Defina sua classePersoncom um construtor que aceita um nome e uma idade. Inclua um método:introduce()que permite que cada pessoa se apresente.main.lua: Requeira seu módulo Person e crie uma instância de pessoa usando as entradas fornecidas. Em seguida, faça com que ela se apresente.
Seu construtor :new(name, age) deve aceitar ambos os valores e armazená-los na nova instância. O método :introduce() deve imprimir exatamente neste formato:
Hello, my name is [name] and I am [age] years oldVocê receberá duas entradas:
- O nome da pessoa
- A idade da pessoa
Por exemplo, se as entradas forem Alice e 25, a saída deve ser:
Hello, my name is Alice and I am 25 years oldFolha de consulta
Para criar objetos com dados únicos, expanda o construtor :new() para aceitar parâmetros e atribuí-los à instância:
local Dog = {}
Dog.__index = Dog
function Dog:new(name, breed)
local instance = {}
setmetatable(instance, self)
instance.name = name
instance.breed = breed
return instance
end
function Dog:introduce()
print("I am " .. self.name .. ", a " .. self.breed)
endCrie instâncias com valores diferentes:
local dog1 = Dog:new("Rex", "German Shepherd")
local dog2 = Dog:new("Bella", "Poodle")
dog1:introduce() -- Saída: I am Rex, a German Shepherd
dog2:introduce() -- Saída: I am Bella, a PoodleCada objeto possui seus próprios dados exclusivos armazenados em sua tabela de instância, enquanto compartilha métodos do protótipo.
Experimente você mesmo
-- Importa o módulo Person
local Person = require('Person')
-- Lê a entrada
local name = io.read()
local age = io.read()
-- TODO: Cria uma nova instância de Person usando Person:new(name, age)
-- TODO: Chama o método introduce() na sua instância de person
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