Colección de formas
Parte de la sección Object Oriented Programming del Journey de Lua de Coddy — lección 59 de 70.
Desafío
FácilAhora 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
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