Menu
Coddy logo textTech

Área total

Parte de la sección Programación Orientada a Objetos del Journey de Lua de Coddy. Lección 60 de 70.

challenge icon

Desafío

Fácil

Añadamos una función potente a tu ShapeCollection: la capacidad de calcular el área total de todas las figuras que contiene. Aquí es donde el polimorfismo realmente brilla: tu colección puede llamar a :getArea() en cualquier figura sin saber si es un rectángulo o un círculo.

Seguirás desarrollando tus archivos de proyecto existentes:

  • 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: amplía tu clase de colección añadiendo un método :getTotalArea(). Este método debe recorrer todas las figuras almacenadas, llamar a :getArea() en cada una y devolver la suma de todas las áreas.
  • main.lua: requiere tus módulos, lee las dimensiones de la entrada, crea un Rectangle y un Circle, añade ambos a un ShapeCollection y después imprime el área total de todas las figuras de la colección.

La ventaja de este enfoque es que :getTotalArea() no necesita una lógica separada para rectángulos y círculos. Simplemente confía en que cada figura de la colección tiene un método :getArea(). Más adelante podrías añadir triángulos, hexágonos o cualquier otra figura, y el cálculo del área total funcionaría sin modificaciones.

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

Salida: Una sola línea que contiene el área total de todas las figuras de la colección.

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 un nuevo ShapeCollection
local collection = ShapeCollection:new()

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

-- Imprime el área total de todas las formas en la colección
print(collection:getTotalArea())

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Lua online