Вот хочу запустить такой код. А компилятор ругается. Помогите разобратся
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>{};
Здравствуйте, Аноним, Вы писали:
А>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;
}
}
Спасибо за код. Буду его юзать
Скажите, а в StrategyFactory можно перенести static методы, чтобы их не размещать в базовый класс Стратегии?