Menu
CoddyTech

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 dado fica. Alguns atributos são compartilhados: definidos na classe pai e acessíveis a todos os filhos. Outros são únicos: 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}  -- Exclusivo: 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  -- Exclusivo: 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 por meio da cadeia de busca:

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

-- Exclusivo desta instância (armazenado em rex)
print(rex.name)    -- "Rex"
print(rex.breed)   -- "German Shepherd"
-- Compartilhado (encontrado por meio de uma busca)
print(rex.sound)   -- "bark" (de Dog)
print(rex.kingdom) -- "Animalia" (de Animal)

A principal diferença: 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 por todas as instâncias dessa classe e de suas classes filhas.

challenge icon

Desafio

Fácil

Vamos explorar como os dados fluem por uma hierarquia de herança criando 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.

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 de 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, adicionar color como um atributo de instância exclusivo de cada dragão.
  • main.lua: Crie dois dragões diferentes e examine 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 (por exemplo, Smaug,red)
  2. O nome e a cor do segundo dragão, separados por uma vírgula (por exemplo, Draco,gold)

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

  1. name do primeiro dragão
  2. color do primeiro dragão
  3. name do segundo dragão
  4. color do segundo dragão
  5. element do primeiro dragão (compartilhado da classe Dragon)
  6. element do segundo dragão (compartilhado da classe Dragon)
  7. world do primeiro dragão (compartilhado da 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 Realm

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

Experimente você mesmo

-- main.lua: Crie dragões e demonstre atributos compartilhados e exclusivos

local Dragon = require('Dragon')

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

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

-- TODO: Analise a segunda entrada para extrair o nome e a cor

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

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

-- TODO: Imprima o seguinte, nesta 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 pela classe Dragon)
-- 6. Elemento do segundo dragão (compartilhado pela classe Dragon)
-- 7. Mundo do primeiro dragão (compartilhado pela 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 Programação orientada a objetos

Pratique por conta própria: Compilador de Lua online