Área total
Parte de la sección Object Oriented Programming del Journey de Lua de Coddy — lección 60 de 70.
Desafío
FácilVamos 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
1El concepto de 'self'
Tablas con funciones'self' explícitoLa sintaxis de dos puntosPunto vs. dos puntosResumen - Punto en movimiento4Proyecto: Banco Digital
Configuración del proyectoMétodo de depósito7Polimorfismo y Sobrescritura
Sobrescritura de métodosLlamar a métodos del padreDuck TypingInterfaz comúnComprobación de tiposRepaso - Roles de empleados10Proyecto: Gestor de formas
Configuración del proyectoClase Rectángulo2Patrón de prototipo de clase
El concepto de prototipoVinculación con __indexEl constructor :new()Inicialización de atributosInstancias independientesResumen - Fábrica de coches5Sobrecarga de operadores en POO
Sumar objetosRestar objetosConcatenar objetosComparar objetos (<, >)Resumen - Matemáticas de la billetera8Encapsulamiento
Convenciones de nomenclaturaClosures para privacidadAcceso mediante ClosuresTablas de solo lecturaLógica de validaciónResumen - Bóveda segura11Patrones de diseño (Lite)
Funciones FactoryTabla SingletonPatrón IteradorObserver (Listener)Resumen - Logger Factory3Estado y Comportamiento de los Objetos
Variables de InstanciaMétodos GetterMétodos SetterPropiedades CalculadasFormateo de StringsComprobaciones de IgualdadResumen - Calificación del Estudiante6Fundamentos de la herencia
Configuración de la herenciaHerencia de métodosExtender el constructorAñadir métodos hijosCompartido vs. ÚnicoResumen: Jerarquía de formas