Verificação Final de POO
Parte da seção Programação Orientada a Objetos do Journey de Lua da Coddy. Lição 70 de 70.
Desafio
FácilVamos reunir tudo o que você aprendeu sobre OOP em Lua! Você criará 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 umnamee um_speedde convenção privada (inicializado como 0). Inclua um getter:getName(), um getter:getSpeed()e um setter:setSpeed(value)que rejeita valores negativos (se for negativo, imprimaSpeed cannot be negativee não altere o valor). Adicione um método:describe()que retorna"{name} moving at {speed}".Refuelable.lua: Uma tabela de mixin contendo comportamento relacionado a combustível. Inclua um método:refuel(amount)que adiciona aself._fuel, e um método:getFuel()que retorna o nível atual de combustível.Car.lua: Herda de Vehicle e usa o mixin Refuelable. O construtor aceita umnamee inicializa_fuelcomo 0. Substitua:describe()para retornar"{name} moving at {speed}, fuel: {fuel}". Aplique o mixin Refuelable para dar aos carros capacidades relacionadas a combustível.Bicycle.lua: Herda apenas de Vehicle: nenhuma funcionalidade de combustível é necessária. O construtor aceita somente umname. As bicicletas usam o método:describe()herdado sem modificações.main.lua: Reúna tudo! Crie um carro e uma bicicleta com base nas entradas, demonstre suas diferentes capacidades e mostre como eles compartilham comportamentos comuns de veículos, embora tenham características distintas.
Você receberá quatro entradas:
- Nome do carro
- Nome da bicicleta
- Velocidade a ser definida para ambos os veículos (um número)
- Quantidade de combustível a adicionar ao carro (um número)
No seu arquivo principal:
- Crie um carro e uma bicicleta com os nomes fornecidos
- Defina a velocidade de ambos os veículos usando a terceira entrada
- Abasteça o carro com a quarta entrada
- Imprima a descrição do carro
- Imprima a descrição da bicicleta
Por exemplo, se as entradas forem Sedan, Mountain Bike, 60 e 45, a saída deverá ser:
Sedan moving at 60, fuel: 45
Mountain Bike moving at 60Se as entradas forem Sports Car, Road Bike, 120 e 80, a saída deverá ser:
Sports Car moving at 120, fuel: 80
Road Bike moving at 120Este desafio demonstra como a herança fornece comportamento compartilhado (ambos os veículos podem se mover), os mixins adicionam capacidades opcionais (somente os carros precisam de combustível) e o encapsulamento protege a integridade dos dados (validação da velocidade). Cada técnica tem uma finalidade diferente no seu design!
Experimente você mesmo
-- main.lua: Reúna 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: Crie um carro com o nome fornecido
-- TODO: Crie uma bicicleta com o nome fornecido
-- TODO: Defina a velocidade para ambos os veículos
-- TODO: Abasteça o carro com a quantidade de combustível
-- TODO: Imprima a descrição do carro
-- TODO: Imprima a descrição da bicicleta
Todas as lições de Programação Orientada a Objetos
1O Conceito 'Self'
Tabelas com Funções'self' ExplícitoA Sintaxe de Dois-pontosPonto vs Dois-pontosRecapitulação - Movendo o Ponto4Projeto: Banco Digital
Configuração do ProjetoMétodo de Depósito7Polimorfismo e Sobrescrita
Sobrescrita de MétodosChamando Métodos da Classe PaiDuck TypingInterface ComumVerificando o TipoRecapitulação - Papéis de Funcionários10Projeto: Gerenciador de Formas
Configuração do ProjetoClasse RetânguloClasse CírculoMétodo PerímetroColeção de FormasÁrea TotalFiltrar Formas2Padrão de Protótipo de Classe
O Conceito de ProtótipoVinculando com __indexO Construtor :new()Inicializando AtributosInstâncias IndependentesRecapitulação - Fábrica de Carros5Sobrecarga de Operadores em POO
Somando ObjetosSubtraindo ObjetosConcatenando ObjetosComparando Objetos (<, >)Recapitulação - Matemática de Carteira8Encapsulamento
Convenções de NomenclaturaClosures para PrivacidadeAcesso via ClosuresTabelas Somente LeituraLógica de ValidaçãoRecapitulação - Cofre Seguro11Padrões de Projeto (Lite)
Funções FactoryTabela SingletonPadrão IteratorObserver (Listener)Recapitulação - Logger Factory3Estado e Comportamento do Objeto
Variáveis de InstânciaMétodos GetterMétodos SetterPropriedades CalculadasFormatação de StringsVerificações de IgualdadeRecapitulação - Nota do Aluno6Fundamentos de Herança
Configurando a HerançaHerdando MétodosEstendendo o ConstrutorAdicionando Métodos FilhosCompartilhado vs ÚnicoRecapitulação - Hierarquia de Formas9Composição e Mixins
Relacionamento Tem-UmDelegaçãoMixins SimplesAplicando Múltiplos MixinsMixins vs HerançaRecapitulação - Montagem de Robô12Desafios Finais
Revisão - Sistema de InventárioRevisão - Gerenciador de UsuáriosRevisão - Rastreador de PontuaçãoVerificação Final de POOPratique por conta própria: Compilador de Lua online