Предположим, у меня есть класс BaseClass
, который имеет два дочерних класса ChildClassA : BaseClass
и ChildClassB : BaseClass
. Для каждого дочернего класса я хочу предоставить некоторую реализацию для двух констант для каждого класса, Zero
и One
, чтобы работал следующий код:
var valueOfZeroA = ChildClassA.Zero;
var valueOfOneB = ChildClassB.Zero;
Я также должен иметь возможность создавать класс generi c, имеющий метод, который выбирает соответствующее значение на основе типа generi c.
class GenericUsingClass<T> where T : BaseClass
{
public void DoStuff()
{
var valueOfZero = T.Zero;
var valueOfOne = T.One;
}
}
Например, если я создал new GenericUsingClass<ChildClassA>()
, то значение valueOfZero
будет таким же, как ChildClassA.Zero
.
Вот моя проблема: Мне нужен какой-то шаблон программирования для реализации чего-то подобного. Я знаю, что синтаксис в моих примерах кода не будет возможен в решении; это только для иллюстративных целей. Я предоставил возможное решение, но нахожу его уродливым, и мне интересно, может ли кто-нибудь предложить мне лучшее решение или объяснить, почему мое решение может быть таким же хорошим, как оно есть.
Пока что я придумали фабричный образец, который, кажется, работал бы прилично. Это выглядит следующим образом:
Для каждого дочернего класса BaseClass
должен быть фабричный класс, такой как ChildClassAFactory
и ChildClassBFactory
, каждый из которых является производным от класса BaseClassFactory
.
Тогда BaseClassFactory
будет определяться как:
abstract class BaseClassFactory<T> where T : BaseClass
{
public abstract T Zero() { ... }
public abstract T One() { ... }
}
, и дочерние фабрики будут реализовывать методы Zero()
и One()
.
. GenericUsingClass
придется быть преобразован в:
class GenericUsingClass<T> where T : BaseClass
{
public void DoStuff()
{
BaseClassFactory<T> factory = new BaseClassFactory<T>();
var valueOfZero = factory.Zero();
var valueOfOne = factory.One();
}
}
или, альтернативно, с помощью внедрения зависимости:
class GenericUsingClass<T> where T : BaseClass
{
public void DoStuff(BaseClassFactory<T> factory)
{
var valueOfZero = factory.Zero();
var valueOfOne = factory.One();
}
}
Мне не нравится этот подход, потому что
- Требуется вдвое больше классов для реализовать функциональность одного дочернего класса, хотя это меня меньше беспокоит.
- Мне нужно либо создать, либо внедрить фабрику объектов в моем обобщенном c, используя класс, который, кажется, добавляет беспорядок в код и делает Реализация менее проста в использовании.
Я также знаю, что рефлексия была бы возможна, но это кажется излишним для этой проблемы и может сильно запутать. Мне просто интересно, какой будет лучшая идея архитектуры программного обеспечения.
Спасибо!