Menu
Coddy logo textTech

Colección de formas

Parte de la sección Object Oriented Programming del Journey de Lua de Coddy — lección 59 de 70.

challenge icon

Desafío

Fácil

Ahora que tienes las clases Rectangle y Circle con funcionalidad completa, vamos a crear una clase ShapeCollection que pueda gestionar múltiples formas juntas. Este es un gran ejemplo de composición: la colección "tiene" formas en lugar de "ser" una forma.

Añadirás un nuevo archivo a tu proyecto en crecimiento:

  • Shape.lua: Tu clase base Shape (sin cambios).
  • Rectangle.lua: Tu clase Rectangle con :getArea() y :getPerimeter().
  • Circle.lua: Tu clase Circle con :getArea() y :getPerimeter().
  • ShapeCollection.lua: Crea una nueva clase que almacene formas internamente. Incluye un constructor :new() que inicialice una lista vacía de formas, un método :addShape(shape) que añada cualquier forma a la colección y un método :count() que devuelva cuántas formas están almacenadas actualmente.
  • main.lua: Reúne todo requiriendo tus módulos. Lee las dimensiones de la entrada, crea un Rectangle y un Circle, añade ambos a una ShapeCollection, luego imprime el conteo de la colección seguido del nombre de cada forma (en el orden en que fueron añadidas).

La ShapeCollection no necesita saber si está almacenando rectángulos o círculos; simplemente contiene formas. Esto demuestra cómo el polimorfismo te permite tratar diferentes tipos de objetos de manera uniforme a través de una interfaz común.

Entrada: Tres líneas: ancho (número), alto (número) y radio (número).

Salida: Tres líneas: el conteo de formas en la colección, luego el nombre de la primera forma añadida, luego el nombre de la segunda forma añadida.

Pruébalo tú mismo

-- Requerir el módulo Rectangle
local Rectangle = require('Rectangle')

-- Requerir el módulo Circle
local Circle = require('Circle')

-- Requerir el módulo ShapeCollection
local ShapeCollection = require('ShapeCollection')

-- Leer el ancho y el alto de la entrada
local width = tonumber(io.read())
local height = tonumber(io.read())
local radius = tonumber(io.read())

-- Crear una nueva instancia de Rectangle con las dimensiones dadas
local rect = Rectangle:new(width, height)

-- Crear una nueva instancia de Circle con el radio dado
local circ = Circle:new(radius)

-- Crear una nueva ShapeCollection
local collection = ShapeCollection:new()

-- Añadir ambas formas a la colección
collection:addShape(rect)
collection:addShape(circ)

-- Imprimir el recuento de formas en la colección
print(collection:count())

-- Imprimir el nombre de cada forma en el orden en que fueron añadidas
for i = 1, collection:count() do
    print(collection.shapes[i]:getName())
end

Todas las lecciones de Object Oriented Programming