Menu
Coddy logo textTech

Área total

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

challenge icon

Desafío

Fácil

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

Continuarás construyendo sobre los archivos de tu proyecto existente:

  • 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: Extiende tu clase de colección añadiendo un método :getTotalArea(). Este método debe iterar a través de todas las formas 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 una ShapeCollection, luego imprime el área total de todas las formas en la colección.

La belleza de este enfoque es que :getTotalArea() no necesita una lógica separada para rectángulos y círculos; simplemente confía en que cada forma en la colección tiene un método :getArea(). Podrías añadir triángulos, hexágonos o cualquier otra forma más tarde, 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 formas en la colección.

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 área total de todas las formas en la colección
print(collection:getTotalArea())

Todas las lecciones de Object Oriented Programming