Существует ли шаблон программирования, обеспечивающий переопределяемые значения по умолчанию для обобщенного c класса в C#? - PullRequest
0 голосов
/ 17 февраля 2020

Предположим, у меня есть класс 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();
    }
}

Мне не нравится этот подход, потому что

  1. Требуется вдвое больше классов для реализовать функциональность одного дочернего класса, хотя это меня меньше беспокоит.
  2. Мне нужно либо создать, либо внедрить фабрику объектов в моем обобщенном c, используя класс, который, кажется, добавляет беспорядок в код и делает Реализация менее проста в использовании.

Я также знаю, что рефлексия была бы возможна, но это кажется излишним для этой проблемы и может сильно запутать. Мне просто интересно, какой будет лучшая идея архитектуры программного обеспечения.

Спасибо!

...