Лучший способ сделать этот общий абстрактный класс в 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
}

Ответы на вопрос(5)

Ваш ответ на вопрос