Я знаю, что делаю это неправильно, но я также знаю, что есть способ сделать это. Я стараюсь быть как можно более универсальным и абстрактным, иначе мой код станет очень запутанным. Так что я использую здесь шаблон стратегии как черт, который является методом GetAggregateClient().
Я хочу иметь абстрактный класс с именем AbstractAggregate, чтобы он использовал дженерики. Тип, который будет использоваться, представляет собой серию классов данных: BlogItem, ResourceItem и AskItem. Все эти классы данных наследуются от ListItem.
Это справочная информация. Проблема здесь в том, что я хочу, чтобы GetAbstractAggregate()возвращал экземпляр одного из клиентских классов, реализующих AbstractAggregate, с указанным типом элемента в зависимости от переданного перечисления. Однако я не могу вернуть «AbstractAggregate». Компилятор не позволит мне, и это имеет смысл, поскольку класс AbstractAggregateFactory не является универсальным.
Есть ли у кого-нибудь лучший способ сделать это?
Большое спасибо.
public static class AggregateHelper
{
public enum AggregateTypes { TankTruckBlog, AskTankTruck, Resources }
}
public static class AbstractAggregateFactory
{
public static AbstractAggregate<T> GetAggregateClient(AggregateHelper.AggregateTypes type)
{
switch (type)
{
case AggregateHelper.AggregateTypes.AskTankTruck:
return new AskTankTruckAggregate<AskItem>();
case AggregateHelper.AggregateTypes.TankTruckBlog:
return new TankTruckBlogAggregate<BlogItem>();
case AggregateHelper.AggregateTypes.Resources:
return new ResourcesAggregate<ResourceItem>();
default:
throw new AggregateDoesNotExistException();
}
}
}
public abstract class AbstractAggregate<T>
{
public abstract List<T> GetAggregate(Guid[] resourcetypes);
public abstract T GetSingle(string friendlyname);
}
public class AskTankTruckAggregate<T> : AbstractAggregate<T>
{
//not implemented yet
}
public class TankTruckBlogAggregate<T> : AbstractAggregate<T>
{
//not implemented yet
}
public class ResourcesAggregate<T> : AbstractAggregate<T>
{
//not implemented yet
}