Estacionamento
Parte da seção Programação orientada a objetos do Journey de Ruby da Coddy. Lição 55 de 57.
Desafio
DifícilConstrua uma garagem de estacionamento. Vehicle armazena uma plate; suas subclasses definem size e hourly_rate: Motorbike tem tamanho 1 (pequeno) e custa 1 por hora, Car tem tamanho 2 (médio) e custa 3, e Van tem tamanho 3 (grande) e custa 5. A constante SIZES da garagem é %w[small medium large]. Garage.new(small, medium, large) recebe o número de vagas por tamanho. park(vehicle) coloca um veículo em uma vaga livre do seu próprio tamanho ou, se nenhuma estiver livre, do próximo tamanho maior, e retorna parked AB12 in medium ou full for AB12. leave(plate, hours) libera a vaga e retorna AB12 paid 9 (a tarifa multiplicada pelo número de horas, com no mínimo 1 hora), ou no vehicle AB12. status retorna free: small 1, medium 0, large 2.
O código fornecido lê as vagas como small,medium,large, depois recebe os comandos park car AB12, leave AB12 3 ou status, e imprime cada resposta.
Seu código deve ser colocado em vehicle.rb, motorbike.rb, car.rb, van.rb e garage.rb. main.rb contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
require_relative 'vehicle'
require_relative 'motorbike'
require_relative 'car'
require_relative 'van'
require_relative 'garage'
# Código de entrada/saída fornecido: mantenha-o como está
input = []
while (line = gets)
input << line.chomp
end
small, medium, large = input[0].split(",").map(&:to_i)
garage = Garage.new(small, medium, large)
kinds = { "bike" => Motorbike, "car" => Car, "van" => Van }
input.drop(1).each do |cmd|
parts = cmd.split
case parts[0]
when "park" then puts garage.park(kinds[parts[1]].new(parts[2]))
when "leave" then puts garage.leave(parts[1], parts[2].to_i)
else puts garage.status
end
end
Todas as lições de Programação orientada a objetos
1Classes e Objetos
Trabalhando com ArquivosDefinindo ClassesVariáveis de InstânciaMétodos e selfto_s e inspectRevisão - Cartão da Biblioteca4Encapsulamento
Métodos privadosMétodos protegidosSetters privadosProtegendo o estadoRevisão - Máquina de venda automática7Polimorfismo e Duck Typing
PolimorfismoDuck TypingMétodos Abstratoscase e ClassesRevisão - Métodos de Pagamento2Acessores e self
Leitores e GravadoresSetters Personalizadosself nos MétodosIdentidade e IgualdadeRecapitulação - Lista de Contatos5Herança
SubclassesSobrescrita de métodosChamando superis_a? e ancestraisRevisão - Folha de pagamento da equipe8Métodos Especiais
Igualdade e hashMétodos de OperadoresIndexação e AdiçãoColeções PersonalizadasRevisão - Frações11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de LivrosPratique por conta própria: Compilador de Ruby online