diff --git a/.idea/misc.xml b/.idea/misc.xml index fdc35ea..389a2fc 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -8,7 +8,7 @@ - + \ No newline at end of file diff --git a/src/main/java/org/Main.java b/src/main/java/org/Main.java index 7a3d8c8..d1d8d8a 100644 --- a/src/main/java/org/Main.java +++ b/src/main/java/org/Main.java @@ -1,126 +1,157 @@ package org; + +import org.behavior.Serviceable; +import org.model.*; +import org.util.VehicleInspector; + + + public class Main { + + public static void main(String[] args) { - // ============================================================ - // TODO 1: - // Create one instance of each vehicle type: - // - ElectricCar - // - GasCar - // - SportsCar - // - // Requirements: - // • Use the constructors you created in each class. - // • Provide realistic values (brand, model, year, mileage, etc.). - // • Store them in variables such as: - // ElectricCar tesla = new ElectricCar(...); - // ============================================================ + + + ElectricCar tesla = + new ElectricCar( + "Tesla", + "Model 3", + 2024, + 6000, + 5, + 75, + 80 + ); + + + + GasCar toyota = + new GasCar( + "Toyota", + "Camry", + 2022, + 15000, + 5, + 60, + "Petrol" + ); + + + + SportsCar ferrari = + new SportsCar( + "Ferrari", + "488", + 2023, + 7000, + 2, + 90, + "Premium Petrol", + 3.2 + ); + + + + Vehicle[] vehicles = + { + tesla, + toyota, + ferrari + }; + + + + System.out.println("=== Vehicle Information ==="); + + + for(Vehicle v : vehicles){ + + v.basicInfo(); + + System.out.println(); + + } + System.out.println("=== Inspection ==="); - // ============================================================ - // TODO 2: - // Create an array of Vehicle: - // Vehicle[] vehicles = { ... }; - // - // This array MUST contain the objects created above. - // This demonstrates **polymorphism** because all different - // subclasses (ElectricCar, GasCar, SportsCar) are stored - // as their parent type (Vehicle). - // ============================================================ + + for(Vehicle v : vehicles){ + + VehicleInspector.inspect(v); + + System.out.println(); + + } + Serviceable[] serviceables = + { + tesla, + toyota, + ferrari + }; - // ============================================================ - // TODO 3: - // Loop through the Vehicle[] array and: - // • Call v.basicInfo(); - // • Print a blank line after each. - // - // Purpose: - // Demonstrate that all subclasses share the same Vehicle - // behavior and can call inherited methods. - // ============================================================ + + + System.out.println("=== Service Check ==="); + + + + for(Serviceable s : serviceables){ + + + Vehicle v = (Vehicle)s; + + + + if(s.needsService(v)){ + + + System.out.println( + v.getBrand() + + " " + + v.getModel() + + " needs service" + ); + + + s.performService(); + + + } + else{ + + + System.out.println( + v.getBrand() + + " " + + v.getModel() + + " does not need service" + ); + + + } + + + System.out.println(); + + } - - // ============================================================ - // TODO 4: - // Use VehicleInspector to inspect each vehicle: - // - // VehicleInspector.inspect(v); - // - // Purpose: - // • Demonstrate the use of `instanceof` - // • Show subclass‑specific inspection messages - // ============================================================ - - - - - - // ============================================================ - // TODO 5: - // Create an array of Serviceable: - // Serviceable[] serviceables = { ... }; - // - // This demonstrates **interface‑based polymorphism**. - // Every Car subtype implements Serviceable. - // - // IMPORTANT: - // • You must cast to Vehicle when needed: - // Vehicle v = (Vehicle) s; - // - // ============================================================ - - - - - - // ============================================================ - // TODO 6: - // Loop through the Serviceable[] array: - // - // Steps inside loop: - // - // 1. Cast the current object to Vehicle: - // Vehicle v = (Vehicle) s; - // - // 2. Check: - // if (s.needsService(v)) { ... } - // - // 3. If true: - // - Print a message showing brand + model - // - Call s.performService(); - // - // 4. Otherwise: - // - Print that the car does not need service - // - // Add blank lines between each item for readability. - // ============================================================ - - - - - - // ============================================================ - // TODO 7 (Optional): - // After everything is done, print a final message: - // - // System.out.println("=== Workshop Completed ==="); - // - // ============================================================ - - - + System.out.println( + "=== Workshop Completed ===" + ); } -} + +} \ No newline at end of file diff --git a/src/main/java/org/model/Car.java b/src/main/java/org/model/Car.java index 74836b5..37186f8 100644 --- a/src/main/java/org/model/Car.java +++ b/src/main/java/org/model/Car.java @@ -1,41 +1,56 @@ package org.model; -/* - * Car extends Vehicle. - * This class SHOULD implement Serviceable. - * - * Service logic for Car: - * - needsService(): return true if mileage > 10,000 - * - performService(): print "General car service completed" - */ - import org.behavior.Serviceable; + public abstract class Car extends Vehicle implements Serviceable { private int seats; + public Car(String brand, String model, int year, double mileage, int seats) { - // TODO: Call super constructor + super(brand, model, year, mileage); this.seats = seats; } - // TODO: Override getEnergyType() → return "Unknown" - // TODO: Override showDetails() - // Print brand, model, year, mileage, and number of seats + public int getSeats(){ + return seats; + } - /* - * Implement Serviceable methods: - * - * needsService(Vehicle v): - * - Check the mileage of the current car - * - If mileage > 10000 return true - * - Otherwise return false - * - * performService(): - * - Print: "General car service completed" - */ -} + + @Override + public String getEnergyType() { + + return "Unknown"; + } + + + @Override + public void showDetails(){ + + System.out.println( + "Brand: " + getBrand() + + "\nModel: " + getModel() + + "\nYear: " + getYear() + + "\nMileage: " + getMileage() + + "\nSeats: " + seats + ); + } + + + @Override + public boolean needsService(Vehicle v){ + + return v.getMileage() > 10000; + } + + + @Override + public void performService(){ + + System.out.println("General car service completed"); + } +} \ No newline at end of file diff --git a/src/main/java/org/model/ElectricCar.java b/src/main/java/org/model/ElectricCar.java index 2ee9bd8..60da61e 100644 --- a/src/main/java/org/model/ElectricCar.java +++ b/src/main/java/org/model/ElectricCar.java @@ -1,39 +1,84 @@ package org.model; -/* - * ElectricCar extends Car. - * It already inherits Serviceable from Car. - * - * Service logic for ElectricCar: - * - needsService(): return true if mileage > 8000 - * - performService(): - * Print "Battery system checked" - * Reset chargeLevel to 100 - */ - import org.behavior.Chargeable; + public class ElectricCar extends Car implements Chargeable { + private int batteryCapacity; private double chargeLevel; + public ElectricCar(String brand, String model, int year, double mileage, int seats, int batteryCapacity, double chargeLevel) { + super(brand, model, year, mileage, seats); + this.batteryCapacity = batteryCapacity; this.chargeLevel = chargeLevel; } - // TODO: Override getEnergyType() → return "Electric" - // TODO: Override showDetails() - // Call super.showDetails() - // Print battery capacity and charge level - // TODO: Implement charge(double amount) - // Validate negative - // Cap at 100 + @Override + public String getEnergyType(){ + + return "Electric"; + } + + + + @Override + public void showDetails(){ + + super.showDetails(); + + System.out.println( + "Battery Capacity: " + batteryCapacity + + "\nCharge Level: " + chargeLevel + ); + } + + + + @Override + public void charge(double amount){ + + if(amount < 0){ + + System.out.println("Charge amount cannot be negative"); + return; + } + + + chargeLevel += amount; + + + if(chargeLevel > 100){ + + chargeLevel = 100; + } + } + + + + @Override + public boolean needsService(Vehicle v){ + + return v.getMileage() > 8000; + } + + + + @Override + public void performService(){ + + System.out.println("Battery system checked"); + + chargeLevel = 100; + } + } diff --git a/src/main/java/org/model/GasCar.java b/src/main/java/org/model/GasCar.java index 2109f93..d5832ab 100644 --- a/src/main/java/org/model/GasCar.java +++ b/src/main/java/org/model/GasCar.java @@ -1,39 +1,91 @@ package org.model; -/* - * GasCar extends Car. - * Inherits Serviceable from Car. - * - * Service logic for GasCar: - * - needsService(): return true if mileage > 12000 - * - performService(): - * Print "Engine oil changed" - * Reset fuelLevel to 100 - */ - import org.behavior.Refuelable; + public class GasCar extends Car implements Refuelable { + private double fuelLevel; private String fuelType; + + public GasCar(String brand, String model, int year, double mileage, int seats, double fuelLevel, String fuelType) { + super(brand, model, year, mileage, seats); + this.fuelLevel = fuelLevel; this.fuelType = fuelType; } - // TODO: Override getEnergyType() → return fuelType + " (Gas)" - // TODO: Implement refuel(double amount) - // Validate amount - // Cap at 100 - // TODO: Override showDetails() - // Call super.showDetails() - // Print fuel level and fuel type + @Override + public String getEnergyType(){ + + return fuelType + " (Gas)"; + } + + + + + @Override + public void refuel(double amount){ + + if(amount < 0){ + + System.out.println("Fuel amount cannot be negative"); + return; + } + + + fuelLevel += amount; + + + if(fuelLevel > 100){ + + fuelLevel = 100; + } + + } + + + + + @Override + public void showDetails(){ + + super.showDetails(); + + + System.out.println( + "Fuel Level: " + fuelLevel + + "\nFuel Type: " + fuelType + ); + + } + + + + + @Override + public boolean needsService(Vehicle v){ + + return v.getMileage() > 12000; + } + + + + @Override + public void performService(){ + + System.out.println("Engine oil changed"); + + fuelLevel = 100; + } + } diff --git a/src/main/java/org/model/SportsCar.java b/src/main/java/org/model/SportsCar.java index 25f5df9..d47707a 100644 --- a/src/main/java/org/model/SportsCar.java +++ b/src/main/java/org/model/SportsCar.java @@ -1,30 +1,57 @@ package org.model; -/* - * SportsCar extends GasCar. - * - * Special service logic for SportsCar: - * - needsService(): return true if mileage > 5000 - * - performService(): - * Print "High-performance brake system checked" - */ public class SportsCar extends GasCar { + private double zeroToHundred; + + public SportsCar(String brand, String model, int year, double mileage, int seats, double fuelLevel, String fuelType, double zeroToHundred) { - super(brand, model, year, mileage, seats, - fuelLevel, fuelType); + + super(brand, model, year, mileage, + seats, fuelLevel, fuelType); + this.zeroToHundred = zeroToHundred; } - // TODO: Override showDetails() - // Call super.showDetails() - // Print acceleration time + + + @Override + public void showDetails(){ + + super.showDetails(); + + + System.out.println( + "0-100 km/h: " + zeroToHundred + " seconds" + ); + + } + + + + + @Override + public boolean needsService(Vehicle v){ + + return v.getMileage() > 5000; + } + + + + @Override + public void performService(){ + + System.out.println( + "High-performance brake system checked" + ); + } + } diff --git a/src/main/java/org/model/Vehicle.java b/src/main/java/org/model/Vehicle.java index 70615a9..749dd6d 100644 --- a/src/main/java/org/model/Vehicle.java +++ b/src/main/java/org/model/Vehicle.java @@ -1,11 +1,5 @@ package org.model; -/* - * Abstract base class for all vehicles. - * This class DOES NOT implement Serviceable. - * Service behavior will be defined in concrete subclasses. - */ - public abstract class Vehicle { private String brand; @@ -20,13 +14,37 @@ public abstract class Vehicle { this.mileage = mileage; } - // TODO: Create getters for all fields - // TODO: Implement addMileage(double km) - // If km is negative → print error - // Otherwise increase mileage + public String getBrand() { + return brand; + } + + public String getModel() { + return model; + } + + public int getYear() { + return year; + } + + public double getMileage() { + return mileage; + } + + + public void addMileage(double km) { + + if(km < 0){ + System.out.println("Mileage cannot be negative"); + return; + } + + mileage += km; + } + + + public abstract String getEnergyType(); - // TODO: Declare abstract method getEnergyType() public void basicInfo() { System.out.println( @@ -36,5 +54,6 @@ public abstract class Vehicle { ); } + public abstract void showDetails(); -} +} \ No newline at end of file diff --git a/src/main/java/org/util/VehicleInspector.java b/src/main/java/org/util/VehicleInspector.java index c83c420..b3702d7 100644 --- a/src/main/java/org/util/VehicleInspector.java +++ b/src/main/java/org/util/VehicleInspector.java @@ -1,22 +1,40 @@ package org.util; -import org.*; -import org.model.Vehicle; -/* - * Utility class to inspect vehicles. - * Demonstrates instanceof and polymorphism. - */ +import org.model.*; + public class VehicleInspector { - public static void inspect(Vehicle v) { + + public static void inspect(Vehicle v){ + v.basicInfo(); - // TODO: - // If ElectricCar → print "Check battery system" - // If SportsCar → print "Check brakes and performance" - // If GasCar → print "Check engine and oil" + + if(v instanceof ElectricCar){ + + System.out.println( + "Check battery system" + ); + + } + else if(v instanceof SportsCar){ + + System.out.println( + "Check brakes and performance" + ); + + } + else if(v instanceof GasCar){ + + System.out.println( + "Check engine and oil" + ); + + } + } -} + +} \ No newline at end of file