У меня есть дилемма дизайна класса: у меня есть общий базовый класс и несколько производных классов. База представляет собой класс CRTP, который обеспечивает общие функции, некоторые из которых требуют данных, относящихся к унаследованным классам. Поэтому базовый класс является абстрактным, а дочерние классы должны реализовывать определенные методы «поставщика». Например:C# класс дизайн - экземпляр независимой информации
public abstract class Base<T> where T : Base<T>, new() {
private static T reference = new T();
public static int Foo => reference.GetFoo();
public static string Bar => reference.GetBar();
protected abstract int GetFoo();
protected abstract string GetBar();
// ...
}
Проблема заключается в том, что информация не зависит от экземпляра и должна быть доступна из общего параметра. Таким образом, используя в качестве примера выше, этот метод может быть в другом классе:
public void ComputeSomething<T>() where T : Base<T>, new() {
int foo = Base<T>.Foo;
// ...
}
Или, если класс отрока: ChildClass.Foo
Это работает, но в целом решение чувствует себя «грязным», как я ненавижу помещайте каждый экземпляр с информацией о типе, а базовый класс должен содержать экземпляр reference
(как подкласс может быть создан в базовом классе, он все еще немного изгибает мой мозг и, как правило, кажется плохой идеей). Я бы поместил информацию в кеш или фабрику или что-то еще, но я не контролирую все дочерние классы, поэтому система должна расширяться. Я посмотрел на использование атрибутов, но нет способа (я знаю), чтобы обеспечить соблюдение определенных атрибутов во время компиляции. На самом деле, мне кажется, что мне нужны статические интерфейсы или статические абстрактные элементы, но у C# их нет.
Так что мой вопрос: как эта проблема вообще решена?
Можете ли вы изменить/реорганизовать код, который использует статические элементы, вместо этого использовать только абстрактные элементы?Как правило, в мире, в котором царит проверка/инверсия управления/зависимость, вы будете стремиться к тому, чтобы все элементы кода использовали нестатические элементы, чтобы они легко подменялись или издевались ... – Reddog
И в отношении вашего утверждения «Как может быть подкласс созданный в своем базовом классе, по-прежнему немного изгибает мой мозг и, как правило, кажется плохой идеей »- Да! Вы правы, плохая идея. Вы ограничиваете себя в отношении зависимостей от строительства и так далее. – Reddog
Да, конечно, я могу реорганизовать код, это скорее прототип. Во многих местах (как в примере) это приведет к чему-то вроде «нового T(). Foo', который просто не кажется правильным. Я начинаю думать, что мне нужен отдельный класс провайдера или что-то – Blue0500