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.
Desafío
FácilAhora 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
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ánguloClase CírculoMétodo de perímetroColección de formasÁrea totalFiltrar formas2Patró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 formasPractica por tu cuenta: Compilador de Lua online