advanced oop

This commit is contained in:
2026-07-19 06:45:15 +03:30
parent 6cb8f9a8d8
commit ca9a3af22e
8 changed files with 410 additions and 203 deletions
+1 -1
View File
@@ -8,7 +8,7 @@
</list> </list>
</option> </option>
</component> </component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="21" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_26" project-jdk-name="26" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" /> <output url="file://$PROJECT_DIR$/out" />
</component> </component>
</project> </project>
+134 -103
View File
@@ -1,126 +1,157 @@
package org; package org;
import org.behavior.Serviceable;
import org.model.*;
import org.util.VehicleInspector;
public class Main { public class Main {
public static void main(String[] args) { public static void main(String[] args) {
// ============================================================
// TODO 1:
// Create one instance of each vehicle type: ElectricCar tesla =
// - ElectricCar new ElectricCar(
// - GasCar "Tesla",
// - SportsCar "Model 3",
// 2024,
// Requirements: 6000,
// • Use the constructors you created in each class. 5,
// • Provide realistic values (brand, model, year, mileage, etc.). 75,
// • Store them in variables such as: 80
// ElectricCar tesla = new ElectricCar(...); );
// ============================================================
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: for(Vehicle v : vehicles){
// Create an array of Vehicle:
// Vehicle[] vehicles = { ... }; VehicleInspector.inspect(v);
//
// This array MUST contain the objects created above. System.out.println();
// This demonstrates **polymorphism** because all different
// subclasses (ElectricCar, GasCar, SportsCar) are stored }
// as their parent type (Vehicle).
// ============================================================
Serviceable[] serviceables =
{
tesla,
toyota,
ferrari
};
// ============================================================
// TODO 3:
// Loop through the Vehicle[] array and: System.out.println("=== Service Check ===");
// • Call v.basicInfo();
// • Print a blank line after each.
//
// Purpose: for(Serviceable s : serviceables){
// Demonstrate that all subclasses share the same Vehicle
// behavior and can call inherited methods.
// ============================================================ 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();
}
System.out.println(
// ============================================================ "=== Workshop Completed ==="
// TODO 4: );
// Use VehicleInspector to inspect each vehicle:
//
// VehicleInspector.inspect(v);
//
// Purpose:
// • Demonstrate the use of `instanceof`
// • Show subclassspecific inspection messages
// ============================================================
// ============================================================
// TODO 5:
// Create an array of Serviceable:
// Serviceable[] serviceables = { ... };
//
// This demonstrates **interfacebased 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 ===");
//
// ============================================================
} }
} }
+39 -24
View File
@@ -1,41 +1,56 @@
package org.model; 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; import org.behavior.Serviceable;
public abstract class Car extends Vehicle implements Serviceable { public abstract class Car extends Vehicle implements Serviceable {
private int seats; private int seats;
public Car(String brand, String model, int year, public Car(String brand, String model, int year,
double mileage, int seats) { double mileage, int seats) {
// TODO: Call super constructor super(brand, model, year, mileage);
this.seats = seats; this.seats = seats;
} }
// TODO: Override getEnergyType() → return "Unknown"
// TODO: Override showDetails() public int getSeats(){
// Print brand, model, year, mileage, and number of seats return seats;
}
/*
* Implement Serviceable methods: @Override
* public String getEnergyType() {
* needsService(Vehicle v):
* - Check the mileage of the current car return "Unknown";
* - If mileage > 10000 return true }
* - Otherwise return false
*
* performService(): @Override
* - Print: "General car service completed" 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");
}
} }
+63 -18
View File
@@ -1,39 +1,84 @@
package org.model; 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; import org.behavior.Chargeable;
public class ElectricCar extends Car implements Chargeable { public class ElectricCar extends Car implements Chargeable {
private int batteryCapacity; private int batteryCapacity;
private double chargeLevel; private double chargeLevel;
public ElectricCar(String brand, String model, int year, public ElectricCar(String brand, String model, int year,
double mileage, int seats, double mileage, int seats,
int batteryCapacity, double chargeLevel) { int batteryCapacity, double chargeLevel) {
super(brand, model, year, mileage, seats); super(brand, model, year, mileage, seats);
this.batteryCapacity = batteryCapacity; this.batteryCapacity = batteryCapacity;
this.chargeLevel = chargeLevel; 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) @Override
// Validate negative public String getEnergyType(){
// Cap at 100
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;
}
} }
+70 -18
View File
@@ -1,39 +1,91 @@
package org.model; 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; import org.behavior.Refuelable;
public class GasCar extends Car implements Refuelable { public class GasCar extends Car implements Refuelable {
private double fuelLevel; private double fuelLevel;
private String fuelType; private String fuelType;
public GasCar(String brand, String model, int year, public GasCar(String brand, String model, int year,
double mileage, int seats, double mileage, int seats,
double fuelLevel, String fuelType) { double fuelLevel, String fuelType) {
super(brand, model, year, mileage, seats); super(brand, model, year, mileage, seats);
this.fuelLevel = fuelLevel; this.fuelLevel = fuelLevel;
this.fuelType = fuelType; this.fuelType = fuelType;
} }
// TODO: Override getEnergyType() → return fuelType + " (Gas)"
// TODO: Implement refuel(double amount)
// Validate amount
// Cap at 100
// TODO: Override showDetails() @Override
// Call super.showDetails() public String getEnergyType(){
// Print fuel level and fuel type
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;
}
} }
+40 -13
View File
@@ -1,30 +1,57 @@
package org.model; 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 { public class SportsCar extends GasCar {
private double zeroToHundred; private double zeroToHundred;
public SportsCar(String brand, String model, int year, public SportsCar(String brand, String model, int year,
double mileage, int seats, double mileage, int seats,
double fuelLevel, String fuelType, double fuelLevel, String fuelType,
double zeroToHundred) { double zeroToHundred) {
super(brand, model, year, mileage, seats,
fuelLevel, fuelType); super(brand, model, year, mileage,
seats, fuelLevel, fuelType);
this.zeroToHundred = zeroToHundred; 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"
);
}
} }
+30 -11
View File
@@ -1,11 +1,5 @@
package org.model; 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 { public abstract class Vehicle {
private String brand; private String brand;
@@ -20,13 +14,37 @@ public abstract class Vehicle {
this.mileage = mileage; this.mileage = mileage;
} }
// TODO: Create getters for all fields
// TODO: Implement addMileage(double km) public String getBrand() {
// If km is negative → print error return brand;
// Otherwise increase mileage }
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() { public void basicInfo() {
System.out.println( System.out.println(
@@ -36,5 +54,6 @@ public abstract class Vehicle {
); );
} }
public abstract void showDetails(); public abstract void showDetails();
} }
+29 -11
View File
@@ -1,22 +1,40 @@
package org.util; package org.util;
import org.*;
import org.model.Vehicle;
/* import org.model.*;
* Utility class to inspect vehicles.
* Demonstrates instanceof and polymorphism.
*/
public class VehicleInspector { public class VehicleInspector {
public static void inspect(Vehicle v) {
public static void inspect(Vehicle v){
v.basicInfo(); v.basicInfo();
// TODO:
// If ElectricCar → print "Check battery system" if(v instanceof ElectricCar){
// If SportsCar → print "Check brakes and performance"
// If GasCar → print "Check engine and oil" 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"
);
}
} }
} }