Menu
Coddy logo textTech

Verificación final de OOP

Parte de la sección Object Oriented Programming del Journey de Lua de Coddy — lección 70 de 70.

challenge icon

Desafío

Fácil

¡Vamos a reunir todo lo que has aprendido sobre la POO en Lua! Construirás un sistema de vehículos que demuestre la herencia, la encapsulación a través de convenciones de nomenclatura y los mixins para capacidades opcionales.

Organizarás tu código en cinco archivos:

  • Vehicle.lua: La clase base para todos los vehículos. Cada vehículo tiene un name y un _speed por convención privada (inicializado en 0). Incluye un getter :getName(), un getter :getSpeed() y un setter :setSpeed(value) que rechace valores negativos (si es negativo, imprime "Speed cannot be negative" y no cambies el valor). Añade un método :describe() que devuelva "{name} moving at {speed}".
  • Refuelable.lua: Una tabla mixin que contiene el comportamiento relacionado con el combustible. Incluye un método :refuel(amount) que sume a self._fuel, y un método :getFuel() que devuelva el nivel de combustible actual.
  • Car.lua: Hereda de Vehicle y utiliza el mixin Refuelable. El constructor acepta un name e inicializa _fuel a 0. Sobrescribe :describe() para devolver "{name} moving at {speed}, fuel: {fuel}". Aplica el mixin Refuelable para dar a los coches capacidades de combustible.
  • Bicycle.lua: Hereda solo de Vehicle; no se necesita funcionalidad de combustible. El constructor acepta solo un name. Las bicicletas utilizan el método :describe() heredado sin modificaciones.
  • main.lua: ¡Reúne todo! Crea un coche y una bicicleta basados en las entradas, demuestra sus diferentes capacidades y muestra cómo comparten el comportamiento común de los vehículos mientras tienen características distintas.

Recibirás cuatro entradas:

  1. Nombre del coche
  2. Nombre de la bicicleta
  3. Velocidad a establecer para ambos vehículos (un número)
  4. Cantidad de combustible a añadir al coche (un número)

En tu archivo principal:

  1. Crea un coche y una bicicleta con los nombres dados
  2. Establece la velocidad para ambos vehículos usando la tercera entrada
  3. Recarga combustible al coche con la cuarta entrada
  4. Imprime la descripción del coche
  5. Imprime la descripción de la bicicleta

Por ejemplo, si las entradas son "Sedan", "Mountain Bike", "60" y "45", la salida debería ser:

Sedan moving at 60, fuel: 45
Mountain Bike moving at 60

Si las entradas son "Sports Car", "Road Bike", "120" y "80", la salida debería ser:

Sports Car moving at 120, fuel: 80
Road Bike moving at 120

Este desafío muestra cómo la herencia proporciona un comportamiento compartido (ambos vehículos pueden moverse), los mixins añaden capacidades opcionales (solo los coches necesitan combustible) y la encapsulación protege la integridad de los datos (validación de velocidad). ¡Cada técnica sirve para un propósito diferente en tu diseño!

Pruébalo tú mismo

-- main.lua: Unir todo

local Car = require('Car')
local Bicycle = require('Bicycle')

-- Leer entradas
local carName = io.read()
local bicycleName = io.read()
local speed = tonumber(io.read())
local fuelAmount = tonumber(io.read())

-- TODO: Crear un coche con el nombre dado

-- TODO: Crear una bicicleta con el nombre dado

-- TODO: Establecer la velocidad para ambos vehículos

-- TODO: Reabastecer el coche con la cantidad de combustible

-- TODO: Imprimir la descripción del coche

-- TODO: Imprimir la descripción de la bicicleta

Todas las lecciones de Object Oriented Programming