Menu
CoddyTech

Compartido vs. Único

Parte de la sección Programación orientada a objetos del Journey de Lua de Coddy. Lección 35 de 70.

Al trabajar con la herencia, es importante entender dónde se encuentra cada dato. Algunos atributos son compartidos: se definen en la clase padre y son accesibles para todos los hijos. Otros son únicos: se crean específicamente en la clase hija o en la instancia.

Considera esta jerarquía:

local Animal = {}
Animal.__index = Animal
Animal.kingdom = "Animalia"  -- Compartido: definido en la clase

function Animal:new(name)
    local obj = {name = name}  -- Único: almacenado en cada instancia
    setmetatable(obj, Animal)
    return obj
end
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
Dog.sound = "bark"  -- Compartido entre todos los Dog

function Dog:new(name, breed)
    local obj = Animal.new(Animal, name)
    obj.breed = breed  -- Único: cada Dog tiene su propia raza
    setmetatable(obj, Dog)
    return obj
end

Cuando creas una instancia de Dog, algunos valores existen directamente en el objeto, mientras que otros se encuentran a través de la cadena de búsqueda:

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

-- Exclusivo de esta instancia (almacenado en rex)
print(rex.name)    -- "Rex"
print(rex.breed)   -- "German Shepherd"
-- Compartido (encontrado mediante búsqueda)
print(rex.sound)   -- "bark" (de Dog)
print(rex.kingdom) -- "Animalia" (de Animal)

La distinción clave: los campos asignados a obj en los constructores son únicos para cada instancia, mientras que los campos definidos directamente en las tablas de clase se comparten entre todas las instancias de esa clase y sus clases hijas.

challenge icon

Desafío

Fácil

Exploremos cómo fluyen los datos a través de una jerarquía de herencia creando un sistema de clases Creature y Dragon. Verás de primera mano qué atributos se comparten entre todas las instancias y cuáles son únicos para cada objeto individual.

Organizarás tu código en tres archivos:

  • Creature.lua: Define la clase padre con un atributo compartido a nivel de clase world = "Fantasy Realm" que comparten todas las criaturas. Incluye un constructor :new(name) que almacene el nombre de la criatura como atributo de instancia.
  • Dragon.lua: Define la clase hija que hereda de Creature. Añade un atributo compartido a nivel de clase element = "fire" que comparten todos los dragones. Tu constructor :new(name, color) debe llamar al constructor padre para obtener el nombre y, después, añadir color como atributo de instancia único para cada dragón.
  • main.lua: Crea dos dragones diferentes e inspecciona sus atributos para mostrar la diferencia entre los datos compartidos y los únicos.

Recibirás dos entradas:

  1. El nombre y el color del primer dragón, separados por una coma (por ejemplo, Smaug,red)
  2. El nombre y el color del segundo dragón, separados por una coma (por ejemplo, Draco,gold)

En tu archivo principal, crea ambos dragones con sus respectivos nombres y colores. Después, imprime la siguiente información en este orden exacto:

  1. El name del primer dragón
  2. El color del primer dragón
  3. El name del segundo dragón
  4. El color del segundo dragón
  5. El element del primer dragón (compartido desde la clase Dragon)
  6. El element del segundo dragón (compartido desde la clase Dragon)
  7. El world del primer dragón (compartido desde la clase Creature)

Por ejemplo, si las entradas son Smaug,red y Draco,gold, la salida debería ser:

Smaug
red
Draco
gold
fire
fire
Fantasy Realm

Observa cómo name y color son diferentes para cada dragón (atributos de instancia únicos), mientras que element y world son iguales para ambos (atributos de clase compartidos que se encuentran a través de la cadena de búsqueda).

Pruébalo tú mismo

-- main.lua: Crea dragones y muestra los atributos compartidos frente a los únicos

local Dragon = require('Dragon')

-- Lee la entrada del primer dragón (name,color)
local input1 = io.read()
-- Lee la entrada del segundo dragón (name,color)
local input2 = io.read()

-- TODO: Analiza la primera entrada para extraer el nombre y el color
-- Pista: Usa string.match con el patrón "([^,]+),([^,]+)"

-- TODO: Analiza la segunda entrada para extraer el nombre y el color

-- TODO: Crea el primer dragón con su nombre y color

-- TODO: Crea el segundo dragón con su nombre y color

-- TODO: Imprime lo siguiente en orden:
-- 1. Nombre del primer dragón
-- 2. Color del primer dragón
-- 3. Nombre del segundo dragón
-- 4. Color del segundo dragón
-- 5. Elemento del primer dragón (compartido desde la clase Dragon)
-- 6. Elemento del segundo dragón (compartido desde la clase Dragon)
-- 7. Mundo del primer dragón (compartido desde la clase Creature)
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Compilador de Lua online