Compartilhado vs Único
Parte da seção Programação Orientada a Objetos do Journey de Lua da Coddy. Lição 35 de 70.
Ao trabalhar com herança, é importante entender onde cada parte dos dados reside. Alguns atributos são compartilhados: definidos na classe-pai e acessíveis a todos os filhos. Outros são exclusivos: criados especificamente na classe-filha ou na instância.
Considere esta hierarquia:
local Animal = {}
Animal.__index = Animal
Animal.kingdom = "Animalia" -- Compartilhado: definido na classe
function Animal:new(name)
local obj = {name = name} -- Único: armazenado em cada instância
setmetatable(obj, Animal)
return obj
endlocal Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
Dog.sound = "bark" -- Compartilhado entre todos os Dogs
function Dog:new(name, breed)
local obj = Animal.new(Animal, name)
obj.breed = breed -- Único: cada Dog tem a sua própria raça
setmetatable(obj, Dog)
return obj
endQuando você cria uma instância de Dog, alguns valores existem diretamente no objeto, enquanto outros são encontrados por meio da cadeia de busca:
local rex = Dog:new("Rex", "German Shepherd")
-- Único para esta instância (armazenado em rex)
print(rex.name) -- "Rex"
print(rex.breed) -- "German Shepherd"-- Compartilhado (encontrado via lookup)
print(rex.sound) -- "bark" (de Dog)
print(rex.kingdom) -- "Animalia" (de Animal)A distinção fundamental: os campos atribuídos a obj nos construtores são exclusivos de cada instância, enquanto os campos definidos diretamente nas tabelas de classe são compartilhados entre todas as instâncias dessa classe e de seus filhos.
Desafio
FácilVamos explorar como os dados fluem por uma hierarquia de herança construindo um sistema de classes Creature e Dragon. Você verá na prática quais atributos são compartilhados entre todas as instâncias e quais são exclusivos de cada objeto individual.
Você organizará seu código em três arquivos:
Creature.lua: defina sua classe pai com um atributo compartilhado no nível da classe,world = "Fantasy Realm", que todas as criaturas compartilham. Inclua um construtor:new(name)que armazene o nome da criatura como um atributo da instância.Dragon.lua: defina sua classe filha, que herda de Creature. Adicione um atributo compartilhado no nível da classe,element = "fire", que todos os dragões compartilham. Seu construtor:new(name, color)deve chamar o construtor da classe pai para o nome e, em seguida, adicionarcolorcomo um atributo exclusivo da instância para cada dragão.main.lua: crie dois dragões diferentes e inspecione seus atributos para demonstrar a diferença entre dados compartilhados e exclusivos.
Você receberá duas entradas:
- O nome e a cor do primeiro dragão, separados por uma vírgula (por exemplo,
Smaug,red) - O nome e a cor do segundo dragão, separados por uma vírgula (por exemplo,
Draco,gold)
Em seu arquivo principal, crie ambos os dragões com seus respectivos nomes e cores. Em seguida, imprima as seguintes informações exatamente nesta ordem:
namedo primeiro dragãocolordo primeiro dragãonamedo segundo dragãocolordo segundo dragãoelementdo primeiro dragão (compartilhado pela classe Dragon)elementdo segundo dragão (compartilhado pela classe Dragon)worlddo primeiro dragão (compartilhado pela classe Creature)
Por exemplo, se as entradas forem Smaug,red e Draco,gold, a saída deverá ser:
Smaug
red
Draco
gold
fire
fire
Fantasy RealmObserve como name e color são diferentes para cada dragão (atributos exclusivos da instância), enquanto element e world são iguais para ambos (atributos compartilhados da classe encontrados por meio da cadeia de busca).
Experimente você mesmo
-- main.lua: Crie dragões e demonstre atributos compartilhados vs únicos
local Dragon = require('Dragon')
-- Leia a entrada para o primeiro dragão (name,color)
local input1 = io.read()
-- Leia a entrada para o segundo dragão (name,color)
local input2 = io.read()
-- TODO: Analise a primeira entrada para extrair name e color
-- Dica: Use string.match com o padrão "([^,]+),([^,]+)"
-- TODO: Analise a segunda entrada para extrair name e color
-- TODO: Crie o primeiro dragão com seu name e color
-- TODO: Crie o segundo dragão com seu name e color
-- TODO: Imprima o seguinte nesta ordem:
-- 1. name do primeiro dragão
-- 2. color do primeiro dragão
-- 3. name do segundo dragão
-- 4. Cor do segundo dragão
-- 5. Elemento do primeiro dragão (compartilhado da classe Dragon)
-- 6. Elemento do segundo dragão (compartilhado da classe Dragon)
-- 7. Mundo do primeiro dragão (compartilhado da classe Creature)
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
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ânguloClasse CírculoMétodo PerímetroColeção de FormasÁrea TotalFiltrar Formas2Padrã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 FormasPratique por conta própria: Compilador de Lua online