Я внедрил сервис Vehicle, который отвечает за обслуживание автомобилей, таких как автомобили и грузовики:
public interface IVehicleService
{
void ServiceVehicle(Vehicle vehicle);
}
public class CarService : IVehicleService
{
void ServiceVehicle(Vehicle vehicle)
{
if (!(vehicle is Car))
throw new Exception("This service only services cars")
//logic to service the car goes here
}
}
У меня также есть транспортное средство factory, которое отвечает за создание службы транспортного средства в соответствии с типом транспортного средства, переданного в метод factory:
public class VehicleServiceFactory
{
public IVehicleService GetVehicleService(Vehicle vehicle)
{
if (vehicle is Car)
{
return new CarService();
}
if (vehicle is Truck)
{
return new TruckService();
}
throw new NotSupportedException("Vehicle not supported");
}
}
Проблема была у меня с методом CarService.ServiceVehicle
. Он принимает Vehicle
, когда в идеале должен принимать Car
, поскольку он знает, что он будет обслуживать только автомобили. Поэтому я решил обновить эту реализацию, чтобы вместо этого использовать дженерики:
public interface IVehicleService<T> where T : Vehicle
{
void ServiceVehicle(T vehicle);
}
public class CarService : IVehicleService<Car>
{
void ServiceVehicle(Car vehicle)
{
//this is better as we no longer need to check if vehicle is a car
//logic to service the car goes here
}
}
public class VehicleServiceFactory
{
public IVehicleService<T> GetVehicleService<T>(T vehicle) where T : Vehicle
{
if (vehicle is Car)
{
return new CarService() as IVehicleService<T>;
}
if (vehicle is Truck)
{
return new TruckService() as IVehicleService<T>;
}
throw new NotSupportedException("Vehicle not supported");
}
}
В настоящее время проблема заключается в вызове этого factory следующим образом:
var factory = new VehicleServiceFactory();
Vehicle vehicle = GetVehicle();
var vehicleService = factory.GetVehicleService(vehicle); // this returns null!
vehicleService.ServiceVehicle(vehicle);
GetVehicleService
возвращает null
, я думаю, потому что я передаю базовый тип Vehicle
в этот метод, поэтому T
будет оценивать до Vehicle
, и невозможно отбросить из CarService
(который реализует IVehicleService<Car>
) для эффективного типа возврата, который был бы IVehicleService<Vehicle>
(пожалуйста, исправьте меня, если я ошибаюсь).
Порадовал бы некоторые рекомендации относительно того, как разрешить это.