Método de perímetro
Parte de la sección Object Oriented Programming del Journey de Lua de Coddy — lección 58 de 70.
Desafío
FácilAmpliemos nuestro Gestor de Formas añadiendo un método :getPerimeter() tanto a la clase Rectangle como a la clase Circle. Al igual que :getArea(), cada forma calcula su perímetro de manera diferente, pero comparten el mismo nombre de método—un ejemplo perfecto de polimorfismo en acción.
Continuarás trabajando con tus archivos existentes:
Shape.lua: Tu clase base Shape permanece sin cambios.Rectangle.lua: Añade un método:getPerimeter()que devuelva el perímetro del rectángulo usando la fórmula 2 × (width + height).Circle.lua: Añade un método:getPerimeter()que devuelva la circunferencia del círculo usando la fórmula 2 × π × radius. Usamath.pipara π.main.lua: Requiere ambos módulos de formas, lee las dimensiones de la entrada, crea un Rectangle y un Circle, luego imprime seis líneas: el nombre, área y perímetro del rectángulo, seguidos por el nombre, área y perímetro del círculo.
Ambas formas tienen ahora una interfaz completa con :getName(), :getArea() y :getPerimeter()—todos accesibles a través de los mismos nombres de métodos a pesar de tener diferentes implementaciones.
Entrada: Tres líneas—width (número), height (número) y radius (número).
Salida: Seis líneas en orden: nombre del rectángulo, área del rectángulo, perímetro del rectángulo, nombre del círculo, área del círculo, perímetro del círculo.
Pruébalo tú mismo
-- Requerir el módulo Rectangle
local Rectangle = require('Rectangle')
-- Requerir el módulo Circle
local Circle = require('Circle')
-- 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)
-- Imprimir el nombre, el área y el perímetro del rectángulo
print(rect:getName())
print(rect:getArea())
print(rect:getPerimeter())
-- Imprimir el nombre, el área y el perímetro del círculo
print(circ:getName())
print(circ:getArea())
print(circ:getPerimeter())
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