Menu
Coddy logo textTech

Compartilhado vs Único

Parte da seção Object Oriented Programming 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 no pai e acessíveis a todos os filhos. Outros são únicos — criados especificamente na classe filha ou 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
end
local 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 sua própria raça
    setmetatable(obj, Dog)
    return obj
end

Quando você cria uma instância de Dog, alguns valores existem diretamente no objeto, enquanto outros são encontrados através da cadeia de busca (lookup chain):

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 busca)
print(rex.sound)   -- "bark" (de Dog)
print(rex.kingdom) -- "Animalia" (de Animal)

A principal distinção: campos atribuídos a obj em construtores são exclusivos de cada instância, enquanto campos definidos diretamente em tabelas de classe são compartilhados entre todas as instâncias dessa classe e seus filhos.

challenge icon

Desafio

Fácil

Vamos explorar como os dados fluem através de uma hierarquia de herança construindo um sistema de classes Creature e Dragon. Você verá em primeira mão 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 de nível de classe world = "Fantasy Realm" que todas as criaturas compartilham. Inclua um construtor :new(name) que armazena o nome da criatura como um atributo de instância.
  • Dragon.lua: Defina sua classe filha que herda de Creature. Adicione um atributo compartilhado de nível de classe element = "fire" que todos os dragões compartilham. Seu construtor :new(name, color) deve chamar o construtor pai para o nome e, em seguida, adicionar color como um atributo de instância exclusivo 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:

  1. O nome e a cor do primeiro dragão, separados por uma vírgula (ex: Smaug,red)
  2. O nome e a cor do segundo dragão, separados por uma vírgula (ex: Draco,gold)

No seu arquivo principal, crie ambos os dragões com seus respectivos nomes e cores. Em seguida, imprima as seguintes informações nesta ordem exata:

  1. O name do primeiro dragão
  2. A color do primeiro dragão
  3. O name do segundo dragão
  4. A color do segundo dragão
  5. O element do primeiro dragão (compartilhado da classe Dragon)
  6. O element do segundo dragão (compartilhado da classe Dragon)
  7. O world do primeiro dragão (compartilhado da classe Creature)

Por exemplo, se as entradas forem Smaug,red e Draco,gold, a saída deve ser:

Smaug
red
Draco
gold
fire
fire
Fantasy Realm

Observe como name e color são diferentes para cada dragão (atributos de instância exclusivos), enquanto element e world são os mesmos para ambos (atributos de classe compartilhados encontrados através da cadeia de busca).

Folha de consulta

Em hierarquias de herança, os atributos podem ser compartilhados (definidos na tabela da classe) ou únicos (armazenados em instâncias individuais).

Atributos compartilhados são definidos diretamente nas tabelas de classe e acessados através da cadeia de busca da metatabela:

local Animal = {}
Animal.__index = Animal
Animal.kingdom = "Animalia"  -- Compartilhado entre todos os Animals

Atributos únicos são atribuídos ao objeto da instância (obj) nos construtores:

function Animal:new(name)
    local obj = {name = name}  -- Único para cada instância
    setmetatable(obj, Animal)
    return obj
end

Classes filhas podem ter seus próprios atributos compartilhados enquanto herdam atributos do pai:

local 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)  -- Chama o construtor pai
    obj.breed = breed  -- Adiciona atributo único da filha
    setmetatable(obj, Dog)
    return obj
end

Acessando atributos:

local rex = Dog:new("Rex", "German Shepherd")

-- Único (armazenado diretamente em rex)
print(rex.name)    -- "Rex"
print(rex.breed)   -- "German Shepherd"

-- Compartilhado (encontrado via busca na metatabela)
print(rex.sound)   -- "bark" (da classe Dog)
print(rex.kingdom) -- "Animalia" (da classe Animal)

Experimente você mesmo

-- main.lua: Cria dragões e demonstra atributos compartilhados vs únicos

local Dragon = require('Dragon')

-- Lê a entrada para o primeiro dragão (nome,cor)
local input1 = io.read()
-- Lê a entrada para o segundo dragão (nome,cor)
local input2 = io.read()

-- TODO: Analisar a primeira entrada para extrair nome e cor
-- Dica: Use string.match com o padrão "([^,]+),([^,]+)"

-- TODO: Analisar a segunda entrada para extrair nome e cor

-- TODO: Criar o primeiro dragão com seu nome e cor

-- TODO: Criar o segundo dragão com seu nome e cor

-- TODO: Imprimir o seguinte em ordem:
-- 1. Nome do primeiro dragão
-- 2. Cor do primeiro dragão
-- 3. Nome 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)
quiz iconTeste seus conhecimentos

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