Помогите разобратся с Дженериками
От: Аноним  
Дата: 18.03.11 14:22
Оценка:
Вот хочу запустить такой код. А компилятор ругается. Помогите разобратся
 public abstract class BaseParam {}
    public class FirstParam : BaseParam { }

    public abstract class BaseStrategy<ParamType>
        where ParamType : BaseParam
    {
        public ParamType Param;
        protected BaseStrategy(ParamType param)
        {
            Param = param;
        }

        public static  BaseStrategy<BaseParam> CreateStrategy(BaseParam param)
        {
            if (param is FirstParam)
                return new FirstStrategy(param as FirstParam);
            return null;
        }
    }

    public class FirstStrategy:BaseStrategy<FirstParam>{};
Re: Помогите разобратся с Дженериками
От: cvetkov  
Дата: 18.03.11 15:32
Оценка:
и в чем проблема?
я вижу только то что у FirstStrategy нет конструктора с параметром типа FirstParam но это не про дженерики
Re: Помогите разобратся с Дженериками
От: HowardLovekraft  
Дата: 18.03.11 15:38
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>skipped

Конструктор FirstStrategy вы пропустили, когда копировали код в сообщение?
Если C# 4, то можно так:
    public interface IStrategy<out ParamType>
        where ParamType : BaseParam
    {
    }

    public abstract class BaseStrategy<ParamType> : IStrategy<ParamType> 
        where ParamType : BaseParam
    {
        // ...

        public static IStrategy<BaseParam> CreateStrategy(BaseParam param)
        {
            if (param is FirstParam)
                return new FirstStrategy(param as FirstParam);
            return null;
        }
    }

Только все равно остаются вопросы:
1) вызывать статический метод у дженерика в этом случае неудобно; в коде придется писать что-то вроде:
BaseStrategy<BaseParam>.CreateStrategy(new FirstParam())

хотя, по идее, здесь типизация дженерика нафиг не нужна. Вынести тогда этот метод в статический класс StrategyFactory, что ли...
2) кмк, логичнее было бы возвращать не IStrategy<BaseParam>, а IStrategy<FirstParam>, IStrategy<SecondParam> и т.д.:
    public static class StrategyFactory
    {
        public static IStrategy<T> CreateStrategy<T>(T param)
            where T : BaseParam
        {
            var firstParam = param as FirstParam;
            if (firstParam != null)
                return (IStrategy<T>)new FirstStrategy(firstParam);

            // ...

            return null;
        }
    }
Re[2]: Помогите разобратся с Дженериками
От: Аноним  
Дата: 21.03.11 06:51
Оценка:
Спасибо за код. Буду его юзать
Re[2]: Помогите разобратся с Дженериками
От: Аноним  
Дата: 21.03.11 07:21
Оценка:
Скажите, а в StrategyFactory можно перенести static методы, чтобы их не размещать в базовый класс Стратегии?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.