Menu
Coddy logo textTech

Colección de formas

Parte de la sección Programación Orientada a Objetos 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 toda su funcionalidad, vamos a crear una clase ShapeCollection que pueda gestionar varias formas juntas. Este es un excelente ejemplo de composición: la colección «tiene» formas en lugar de «ser» una forma.

Añadirás un archivo nuevo 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 clase nueva que almacene las 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 y después imprime la cantidad de la colección seguida del nombre de cada forma (en el orden en que se añadieron).

ShapeCollection no necesita saber si almacena rectángulos o círculos. Simplemente contiene formas. Esto demuestra cómo el polimorfismo permite tratar distintos tipos de objetos de manera uniforme mediante una interfaz común.

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

Salida: tres líneas: la cantidad de formas de la colección, después el nombre de la primera forma añadida y después el nombre de la segunda forma añadida.

Pruébalo tú mismo

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

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

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

-- Lee el ancho y la altura desde la entrada
local width = tonumber(io.read())
local height = tonumber(io.read())
local radius = tonumber(io.read())

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

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

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

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

-- Imprime el conteo de formas en la colección
print(collection:count())

-- Imprime 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 Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Lua online