Método de perímetro
Parte de la sección Programación Orientada a Objetos del Journey de Lua de Coddy. Lección 58 de 70.
Desafío
FácilAmpliemos nuestro administrador de formas añadiendo un método :getPerimeter() a las clases Rectangle y 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 del polimorfismo en acción.
Seguirá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, y después imprime seis líneas: el nombre, el área y el perímetro del rectángulo, seguidos del nombre, el área y el perímetro del círculo.
Ahora ambas formas tienen una interfaz completa con :getName(), :getArea() y :getPerimeter(): todos son accesibles mediante los mismos nombres de método a pesar de sus 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 y perímetro del círculo.
Pruébalo tú mismo
-- Requiere el módulo Rectangle
local Rectangle = require('Rectangle')
-- Requiere el módulo Circle
local Circle = require('Circle')
-- 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)
-- Imprime el nombre, el área y el perímetro del rectángulo
print(rect:getName())
print(rect:getArea())
print(rect:getPerimeter())
-- Imprime el nombre, el área y el perímetro del círculo
print(circ:getName())
print(circ:getArea())
print(circ:getPerimeter())
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