public abstract class Vehicle : IVehicle
public Vehicle(string name)
public string Name { get { return name; } }
if(value.Size > MaxCargoSize || value.Weight > MaxCargoWeight)
value.ReportLoadingAttempt(false, this);
cargo.ReportLoadingAttempt(true, this);
public abstract int Wheels { get; }
public abstract int Doors { get; }
public abstract int Seats { get; }
protected abstract int MaxCargoSize { get; }
protected abstract int MaxCargoWeight { get; }
public string Specs { get { return Program.GetSpecsStringForVehicle(this); } }
public class Motorcycle : Vehicle
public Motorcycle(string name) : base (name) {}
public override int Wheels { get { return 2; } }
public override int Doors { get { return 0; } }
public override int Seats { get { return 1; } }
protected override int MaxCargoSize { get { return 10; } }
protected override int MaxCargoWeight { get { return 10; } }
public class Car : Vehicle
const int NO_MORE_DOORS_THAN = 7;
const int SEATS_NO_MORE_THAN = 10;
const int CARGO_SIZE_NO_BIGGER_THAN = 100;
const int CARGO_WEIGHT_NO_BIGGER_THAN = 100;
readonly int maxCargoSize;
readonly int maxCargoWeight;
public Car(string name, int doors, int seats, int maxCargoSize, int maxCargoWeight) : base(name)
if(doors > NO_MORE_DOORS_THAN)
throw new Exception("Number of doors specified too much for any car");
if(seats > SEATS_NO_MORE_THAN)
throw new Exception("Number of seats specified too much for any car");
if(maxCargoSize > CARGO_SIZE_NO_BIGGER_THAN || maxCargoWeight > CARGO_WEIGHT_NO_BIGGER_THAN)
throw new Exception("Max cargo size or weight specified too big for any car");
this.maxCargoSize = maxCargoSize;
this.maxCargoWeight = maxCargoWeight;
public override int Wheels { get { return 4; } }
public override int Doors { get { return doors; } }
public override int Seats { get { return seats; } }
protected override int MaxCargoSize { get { return maxCargoSize; } }
protected override int MaxCargoWeight { get { return maxCargoWeight; } }
public class Truck : Vehicle
public Truck(string name, int wheels) : base(name)
if(wheels < 4) throw new Exception("Trucks can't have less than 4 wheels");
public override int Wheels { get { return wheels; } }
public override int Doors { get { return 2; } }
public override int Seats { get { return 3; } }
protected override int MaxCargoSize { get { return 1000; } }
protected override int MaxCargoWeight { get { return 1000; } }
public string Name { get; set;}
public int Size { get; set;}
public int Weight {get; set; }
public void ReportLoadingAttempt(bool succeeded, IVehicle vehicle)
if(succeeded) Console.WriteLine(Name + " has been loaded onto " + vehicle.Name);
else Console.WriteLine(Name + " NOT LOADED onto " + vehicle.Name);
public interface IVehicle
Cargo LoadedCargo { get; set;}
public static string GetSpecsStringForVehicle(IVehicle vehicle)
return "This vehicle has " + vehicle.Wheels + " wheels, can seat " + vehicle.Seats + " " + (vehicle.Seats == 1 ? "person" : "people") + " and has " + vehicle.Doors + " doors";
static void TestVehicle(IVehicle vehicleToTest, Cargo[] cargos)
Console.WriteLine(vehicleToTest.Name + ":");
Console.WriteLine(vehicleToTest.Specs);
foreach(Cargo cargoToTryLoading in cargos)
vehicleToTest.LoadedCargo = cargoToTryLoading;
Console.WriteLine("FINAL CARGO for " + vehicleToTest.Name + ": " + vehicleToTest.LoadedCargo.Name);
public static void Main()
Cargo[] cargos = new Cargo[]
new Cargo() { Name = "Backpack", Size = 5, Weight = 5 },
new Cargo() { Name = "Bike", Size = 20, Weight = 25 },
new Cargo() { Name = "Camping gear", Size = 45, Weight = 35 },
new Cargo() { Name = "Shopping centre delivery", Size = 120, Weight = 150 }
Motorcycle motorbike = new Motorcycle("Motorbike");
TestVehicle(motorbike, cargos);
Car smallCar = new Car("Small car", 2, 2, 20, 20);
TestVehicle(smallCar, cargos);
Car averageCar = new Car("Average car", 4, 5, 50, 30);
TestVehicle(averageCar, cargos);
Car peopleCarrier = new Car("People carrier", 4, 8, 60, 40);
TestVehicle(peopleCarrier, cargos);
Truck eightWheeler = new Truck("8 wheeler truck", 8);
TestVehicle(eightWheeler, cargos);
Truck twoWheelTruck = new Truck("2 wheeler truck", 2);
Console.WriteLine(ex.Message);
Car twelveSeatCar = new Car("Minibus!", 4, 12, 80, 80);
Console.WriteLine(ex.Message);