Menu
Coddy logo textTech

Verificação Final de POO

Parte da seção Object Oriented Programming do Journey de Lua da Coddy — lição 70 de 70.

challenge icon

Desafio

Fácil

Vamos reunir tudo o que você aprendeu sobre POO em Lua! Você construirá um sistema de veículos que demonstra herança, encapsulamento por meio de convenções de nomenclatura e mixins para capacidades opcionais.

Você organizará seu código em cinco arquivos:

  • Vehicle.lua: A classe base para todos os veículos. Cada veículo tem um name e um _speed de convenção privada (inicializado em 0). Inclua um getter :getName(), um getter :getSpeed() e um setter :setSpeed(value) que rejeita valores negativos (se negativo, imprima "Speed cannot be negative" e não altere o valor). Adicione um método :describe() que retorna "{name} moving at {speed}".
  • Refuelable.lua: Uma tabela mixin contendo comportamento relacionado a combustível. Inclua um método :refuel(amount) que adiciona ao self._fuel, e um método :getFuel() que retorna o nível de combustível atual.
  • Car.lua: Herda de Vehicle e usa o mixin Refuelable. O construtor aceita um name e inicializa _fuel como 0. Sobrescreva :describe() para retornar "{name} moving at {speed}, fuel: {fuel}". Aplique o mixin Refuelable para dar aos carros capacidades de combustível.
  • Bicycle.lua: Herda apenas de Vehicle — nenhuma funcionalidade de combustível é necessária. O construtor aceita apenas um name. As bicicletas usam o método :describe() herdado sem modificação.
  • main.lua: Reúna tudo! Crie um carro e uma bicicleta com base nas entradas, demonstre suas diferentes capacidades e mostre como eles compartilham o comportamento comum de veículo enquanto possuem características distintas.

Você receberá quatro entradas:

  1. Nome do carro
  2. Nome da bicicleta
  3. Velocidade a ser definida para ambos os veículos (um número)
  4. Quantidade de combustível a ser adicionada ao carro (um número)

No seu arquivo principal:

  1. Crie um carro e uma bicicleta com os nomes fornecidos
  2. Defina a velocidade para ambos os veículos usando a terceira entrada
  3. Abasteça o carro com a quarta entrada
  4. Imprima a descrição do carro
  5. Imprima a descrição da bicicleta

Por exemplo, se as entradas forem "Sedan", "Mountain Bike", "60" e "45", a saída deve ser:

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

Se as entradas forem "Sports Car", "Road Bike", "120" e "80", a saída deve ser:

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

Este desafio demonstra como a herança fornece comportamento compartilhado (ambos os veículos podem se mover), mixins adicionam capacidades opcionais (apenas carros precisam de combustível) e o encapsulamento protege a integridade dos dados (validação de velocidade). Cada técnica serve a um propósito diferente em seu design!

Experimente você mesmo

-- main.lua: Juntando tudo

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

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

-- TODO: Criar um carro com o nome fornecido

-- TODO: Criar uma bicicleta com o nome fornecido

-- TODO: Definir a velocidade para ambos os veículos

-- TODO: Abastecer o carro com a quantidade de combustível

-- TODO: Imprimir a descrição do carro

-- TODO: Imprimir a descrição da bicicleta

Todas as lições de Object Oriented Programming