Это короткий отрывок по сути, я скрыл детали, которые не имеют отношения к делу. Цель состоит в том, чтобы заставить мою фабрику работать с типами, разработанными мною обобщенными типами. В конце поста у меня есть два наблюдения.
Интерфейс
public interface IWorker<T> where T : IWorkload
{
T CraftWorkload(string plainWorkload);
Task DoWork(T workload);
}
IWorkload
public interface IWorkload
{
// some properties
}
Базовый класс
internal abstract class Worker<T> : IWorker<T> where T : IWorkload
{
public T CraftWorkload(string workAsJsonString)
{
return JsonConvert.DeserializeObject<T>(workAsJsonString, new JsonSerializerSettings
{
MissingMemberHandling = MissingMemberHandling.Error
});
}
public abstract Task DoWork(T workload);
}
Другой производный базовый класс
internal abstract class RestWorker<T> : Worker<T> where T : IWorkload
{
// this is a worker that interact with http requests
}
Бетонщики
internal class WorkerA: RestWorker<WorkerA_Workload>
{
public override Task DoWork(WorkerA_Workload workload)
{
}
}
internal abstract class WorkerB: Worker<WorkerB_Workload>
{
public override Task DoWork(WorkerB_Workload workload)
{
}
}
WorkersFactory
MessageType
- это перечисление, которое идентифицирует воркера с типом
internal interface IWorkerFactory
{
IWorker<IWorkload> GetWorker(MessageType type);
}
internal class WorkerFactory : IWorkerFactory
{
public IWorker<IWorkload> GetWorker(MessageType type)
{
switch (type)
{
case MessageType.WorkerA:
return new WorkerA() as IWorker<IWorkload>;
case MessageType.WorkerB:
return new WorkerB() as IWorker<IWorkload>;
.
.
.
.
.
default:
throw new ArgumentException("The type must be a type that maps to an available worker");
}
}
}
Два наблюдения:
- Если я изменю Factory для возврата без неявного приведения к
IWorker<IWorkload>
, он запутается - Если я приведу (как показано в коде), он вернет null
Является ли мое наследование смысл?