Фабрика, чтобы вернуть реализацию Generic - PullRequest
1 голос
/ 22 мая 2019

Я пытаюсь вернуть реализацию обобщенного абстрактного класса, используя фабрику, так что вызывающей программе не нужно знать, что вернул конкретный тип. Но не удалось.

Классы сущностей

public class Car:IMoveable    { }
public interface IMoveable    { }

Классы обслуживания

public abstract class Service<TEntity>
{
   public abstract void PerformService(TEntity t);
}

public class VehicleService : Service<IMoveable>
{
     public override void PerformService(IMoveable t) {     }
}

public class DefaultService : Service<object>
{
     public override void PerformService(object t){  }
}

Фабрика:

public static class ServiceFactory
{
   public static Service<TEntity> CreateService<TEntity>(TEntity entity) where TEntity : class
   {
      if (typeof(IMoveable).IsAssignableFrom(typeof(TEntity)))
      {
          // run time error here as returns null
          return  new VehicleService() as Service<TEntity>;
          //compiler error
          return (Service<TEntity>) new VehicleService();
      }
      else
      {
         return new DefaultService() as Service<TEntity>;
      }
   }
}

Телефонный код

static void Main(string[] args)
{
   var car = new Car();
   var service = ServiceFactory.CreateService(car);
}

Проблема в том, что служба после createService всегда равна нулю.

Я подозреваю, что проблема в том, что TEntity передается как Car, тогда как VehicleService реализован как IMovebale. Но просто не могу понять, как это сделать, или это вообще возможно?

Заранее спасибо.

1 Ответ

0 голосов
/ 22 мая 2019

Вам необходимо пометить TEntity универсальный тип Service как контравариантный через ключевое слово in и использовать базовый интерфейс вместо базового абстрактного класса, тогда приведение к базовому базовому типу будет работать:

public interface Service<in TEntity>
{
    void PerformService(TEntity t);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...