Лучший способ сделать этот общий абстрактный класс в 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
}
9
задан apexdodge 30 March 2012 в 08:36
поделиться