Лучший способ сделать этот общий абстрактный класс в C #?
Я знаю, что я делаю это неправильно, но я также знаю, что есть способ сделать это. Я пытаюсь быть настолько обобщенным и абстрактным, насколько это возможно, иначе мой код станет очень запутанным. Таким образом, я использую шаблон стратегии здесь в качестве ада, который является методом 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
}