Страницы

Поиск по вопросам

понедельник, 4 февраля 2019 г.

Абстрактный класс и generic в C#

Здравствуйте. Прошу вашего совета вот по какому вопросу. Уменя есть акая иерархия классов enum SomeEnum { First, Second }
abstract class BaseClass { private SomeEnum ActionId { get; set; }
protected BaseClass(SomeEnum actionId) { ActionId = actionId; }
public static T GetById(SomeEnum actionId) where T : BaseClass { switch(actionId) { case SomeEnum.First: return new DerivedFirst(actionId) as T; case SomeEnum.Second: return new DerivedSecond(actionId) as T; default: throw new ArgumentException(); } } }
class DerivedFirst : BaseClass { public DerivedFirst(SomeEnum actionId) : base(actionId) {
}
}
class DerivedSecond : BaseClass { public DerivedSecond(SomeEnum actionId) : base(actionId) {
} } Проблема в том, что в абстрактном классе BaseClass есть статический метод, который возвращает экземпляр класса DerivedFirst или DerivedSecond в зависимости от типа параметра actionId. Мне кажется что я написал плохое решение. Может вы подскажете что-то получше, ничего в голову не приходит((


Ответ

(Обновляю ответ в связи с изменившимся условием.) class ActionFactory { static Dictionary> activators = new Dictionary>() { { SomeEnum.First, () => new DerivedFirst(SomeEnum.First) }, { SomeEnum.Second, () => new DerivedSecond(SomeEnum.Second) } };
public static BaseClass Create(SomeEnum actionId) { Func activator; if (!activators.TryGetValue(actionId, out activator)) throw new ArgumentException("Unsupported action id", "actionId"); return activator(); } } Нет никакого смысла делать Create генерик-функцией, так как это требует знания типа возвращаемого значения на этапе компиляции, а если этот тип известен, вы можете непосредственно вызвать конструктор.

Комментариев нет:

Отправить комментарий