У меня есть следующий абстрактный класс, мне было интересно, могут ли кто-нибудь предложить какие-либо улучшения в плане более строгого соблюдения наших требований или упрощения внедрения ControllerBase.Улучшить этот общий абстрактный класс
//Dependency Provider base
public abstract class ControllerBase<TContract, TType> where TType : TContract, class
{
public static TContract Instance
{
get {
return ComponentFactory.GetComponent<TContract, TType>();
}
}
public TContract GetComponent<TContract, TType>() where TType : TContract, class
{
component = (TType)Activator.CreateInstance(typeof(TType), true);
RegisterComponentInstance<TContract>(component);
}
}
//Contract
public interface IController
{
void DoThing();
}
//Actual Class Logic
public class Controller: ControllerBase<IController,Controller>
{
public void DoThing();
//internal constructor
internal Controller(){}
}
//Usage
public static void Main()
{
Controller.Instance.DoThing();
}
Следующие факты должны всегда быть верным,
TType
всегда должны осуществлятьTContract
(Форсированная с помощью общего ограничения)TContract
должен быть интерфейс (не может найти способ обеспечения соблюдения)TType
не должен иметь публичный конструктор, только внутренний, есть ли способ Использовать, используяControllerBase
?TType
должен быть в конкретный класс (Не включать New() в качестве родового стеснять, так как конструкторы должны быть помечены как Internal)
Применение TContract, являющегося интерфейсом, кажется бессмысленным. Не поймите меня неправильно, но интерфейсы не могут быть созданы. Понимать их как простые контракты, не более того, они применяют (в основном) только поведение. Но они не типы, ни классы. Вы должны попытаться объяснить, почему вы хотите, чтобы он был интерфейсом. –
Извините, я не знаю, почему я сказал интерфейс, я имел в виду абстрактный класс –
Не могли бы вы объяснить, почему это не сработает? –