Layanan Penyewaan Kendaraan
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C# di Coddy. Pelajaran 70 dari 70.
Tantangan
MudahMari buat layanan penyewaan kendaraan yang memadukan pewarisan, antarmuka, dan pola Strategy! Kamu akan membuat sistem untuk menyewakan berbagai jenis kendaraan dengan strategi penetapan harga yang fleksibel, sekaligus menunjukkan bagaimana OOP memungkinkan logika bisnis yang mudah dipelihara dan dikembangkan.
Kamu akan mengatur kodemu dalam enam file:
Vehicle.cs: Buat hierarki kendaraanmu dalam namespaceRental.Models. class dasarVehicleharus memiliki propertyLicensePlatedanBrandyang hanya bisa dibaca,DailyRate(decimal), serta propertyIsAvailabledengan setter privat yang nilainya dikendalikan melalui methodMarkAsRented()danMarkAsReturned(). Lalu buat tiga class turunan:Cardengan propertySeats,Motorcycledengan propertyEngineCC, danTruckdengan propertyCargoCapacity(decimal). Setiap class turunan harus memanggil konstruktor dasar dan mengatur property uniknya.IPricingStrategy.cs: Definisikan antarmukaIPricingStrategydalam namespaceRental.Pricingdengan satu methodCalculatePrice(Vehicle vehicle, int days)yang mengembalikan nilai decimal.PricingStrategies.cs: Terapkan dua strategi penetapan harga dalam namespaceRental.Pricing.StandardPricingmengalikan tarif harian kendaraan dengan jumlah hari.WeekendDiscountPricingmemberikan diskon 10% (kalikan dengan 0.9) jika penyewaan berlangsung selama 2 hari atau lebih. Jika tidak, gunakan perhitungan standar.RentalRecord.cs: Buat classRentaldalam namespaceRental.Modelsuntuk mencatat penyewaan. Class ini harus memiliki property yang hanya bisa dibaca untukCustomerName(string),Vehicle(Vehicle),Days(int), danTotalPrice(decimal). Atur semuanya melalui konstruktor.RentalService.cs: Buat classRentalServicedalam namespaceRental.Servicesuntuk mengelola armada dan memproses penyewaan. Class ini menerimaIPricingStrategymelalui konstruktor (injeksi dependensi). Terapkan:AddVehicle(Vehicle vehicle)- menambahkan kendaraan ke armadaRentVehicle(string customerName, string licensePlate, int days)- mengembalikan objectRentaljika kendaraan tersedia, atau mengembalikannulljika tidak. Ingat untuk menandai kendaraan sebagai disewa dan menghitung harga menggunakan strategi yang diinjeksi.ReturnVehicle(string licensePlate)- menandai kendaraan sebagai tersedia, lalu mengembalikantruejika berhasilGetAvailableVehicles()- mengembalikan list semua kendaraan yang tersedia
Program.cs: Satukan semuanya dengan membuat kendaraan, menyiapkan layanan dengan strategi penetapan harga, dan memproses operasi penyewaan berdasarkan input.
Kamu akan menerima input berikut:
- Strategi penetapan harga yang digunakan (
standardatauweekend) - Jumlah kendaraan yang akan ditambahkan
- Untuk setiap kendaraan: jenis (
car,motorcycle, atautruck), nomor pelat, merek, tarif harian, dan nilai khusus jenis kendaraan (jumlah kursi, engineCC, atau kapasitas kargo) - Jumlah operasi yang akan dilakukan
- Untuk setiap operasi: tindakan yang diikuti data terkait
Format operasi:
rent
{customerName}
{licensePlate}
{days}
return
{licensePlate}
availableFormat output:
- Penyewaan berhasil:
Rented: {Brand} ({LicensePlate}) to {CustomerName} for {Days} days - Total: {TotalPrice} - Penyewaan gagal:
Rental failed: {licensePlate} - Pengembalian berhasil:
Returned: {licensePlate} - Pengembalian gagal:
Return failed: {licensePlate} - Kendaraan tersedia: Cetak setiap kendaraan yang tersedia dengan format
{Type}: {Brand} ({LicensePlate}) - {DailyRate}/day, dengan Type berupa "Car", "Motorcycle", atau "Truck"
Contohnya, jika inputnya adalah:
weekend
3
car
ABC-123
Toyota
50
5
motorcycle
XYZ-789
Honda
30
600
truck
TRK-001
Ford
80
2000
5
available
rent
Alice
ABC-123
3
rent
Bob
ABC-123
2
available
return
ABC-123Outputnya adalah:
Car: Toyota (ABC-123) - 50/day
Motorcycle: Honda (XYZ-789) - 30/day
Truck: Ford (TRK-001) - 80/day
Rented: Toyota (ABC-123) to Alice for 3 days - Total: 135.0
Rental failed: ABC-123
Motorcycle: Honda (XYZ-789) - 30/day
Truck: Ford (TRK-001) - 80/day
Returned: ABC-123Perhatikan bahwa strategi penetapan harga diinjeksi ke dalam layanan. Kamu bisa dengan mudah mengganti StandardPricing dengan WeekendDiscountPricing tanpa mengubah kode RentalService sama sekali. Inilah keunggulan pola Strategy yang dipadukan dengan injeksi dependensi!
Coba sendiri
using System;
using System.Collections.Generic;
using Rental.Models;
using Rental.Pricing;
using Rental.Services;
class Program
{
public static void Main(string[] args)
{
// Baca tipe strategi harga
string strategyType = Console.ReadLine();
// TODO: Buat strategi harga yang sesuai berdasarkan input
// "standard" -> StandardPricing
// "weekend" -> WeekendDiscountPricing
IPricingStrategy strategy = null; // TODO: Inisialisasi berdasarkan strategyType
// TODO: Buat RentalService dengan strategi harga
// Baca jumlah kendaraan
int vehicleCount = Convert.ToInt32(Console.ReadLine());
// TODO: Baca dan tambahkan setiap kendaraan ke layanan
// Untuk setiap kendaraan, baca:
// - tipe (mobil, sepeda motor, truk)
// - pelat nomor
// - merek
// - tarif harian
// - nilai khusus tiap tipe (jumlah kursi, engineCC, atau kapasitas muatan)
// Baca jumlah operasi
int operationCount = Convert.ToInt32(Console.ReadLine());
// TODO: Proses setiap operasi
// Operasi: rent, return, available
//
// Untuk "rent":
// Baca customerName, licensePlate, days
// Output: "Rented: {Brand} ({LicensePlate}) to {CustomerName} for {Days} days - Total: {TotalPrice}"
// Atau: "Rental failed: {licensePlate}"
//
// Untuk "return":
// Baca licensePlate
// Output: "Returned: {licensePlate}" atau "Return failed: {licensePlate}"
//
// Untuk "available":
// Tampilkan setiap kendaraan yang tersedia dengan format:
// "{Type}: {Brand} ({LicensePlate}) - {DailyRate}/day"
}
}
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalNamespace & DirektifPengantar class & objectKata Kunci 'this'Method dan ParameterField vs PropertyKonstruktorInisialisasi objectRingkasan: Kalkulator Sederhana4Pewarisan
Sintaks Dasar Pewarisan (:)Kata Kunci 'base'Kata Kunci Virtual & OverrideClass SealedBase Class 'object'Rangkuman: Hierarki Karyawan7Fitur Lanjutan
Overloading OperatorIndexer (this[])Penimpaan ToString()Extension methodRingkasan: Custom list2Property & Anggota Statis
Property yang Diimplementasikan OtomatisProperty Hanya Baca dan Hanya TulisField dan method StatisClass StatisAnggota Berbentuk Ekspresi5Polimorfisme & Antarmuka
Polimorfisme saat kompilasi vs runtimeAntarmuka vs kelas abstrakBeberapa antarmukaAntarmuka eksplisitUpcasting & DowncastingRingkasan, Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi daripada PewarisanGenerics (class dan method)Delegate dan EventAtribut dan ReflectionIDisposable dan Pernyataan usingDasar-Dasar Dependency Injection11Pola Desain Bagian 2
Pola PerintahPola AdapterPola DecoratorPola Template MethodPola StatePola CompositeLatihan sendiri: Compiler C# online