C# 改进这个泛型抽象类

C# 改进这个泛型抽象类,c#,generics,oop,interface,C#,Generics,Oop,Interface,我有下面的抽象类设计,我想知道是否有人可以提出任何改进建议,以加强需求的执行或简化ControllerBase的实现 //Dependency Provider base public abstract class ControllerBase<TContract, TType> where TType : TContract, class { public static TContract Instance { get { return

我有下面的抽象类设计,我想知道是否有人可以提出任何改进建议,以加强需求的执行或简化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,class
{
公共静态TContract实例
{
获取{
返回ComponentFactory.GetComponent();
}
}
public TContract GetComponent(),其中TType:TContract,class
{   
component=(TType)Activator.CreateInstance(typeof(TType),true);
注册表组件状态(组件);
}
}
//合同
公共接口IController
{
虚空打点();
}
//实际类逻辑
公共类控制器:ControllerBase
{
公共空间点滴();
//内部构造函数
内部控制器(){}
}
//用法
公共静态void Main()
{
Controller.Instance.DoThing();
}
以下事实应该永远是正确的

  • t类型
    应始终实施
    t合同
    (使用通用约束强制实施)

  • t合同
    必须是一个接口(找不到强制执行的方法)

  • TType
    不应该有公共构造函数,而应该是一个内部构造函数,有没有办法使用
    ControllerBase
    来强制实现这一点

  • TType
    必须是一个具体的类(没有将New()作为泛型约束,因为构造函数应该标记为Internal)


有一种方法可以强制TType成为一个具体的类,同时禁止构造函数成功。我想可以尝试实例化TType,只有当它是一个具体的类型时才会成功,但是,您希望避免实例化。我建议尝试从构造函数中抛出异常。在控制器库中,可以用异常处理代码围绕实例化。只有当您实例化具体类型时,它才能通过编译时,如果您抛出异常,它将通过运行时。。。这是一种糟糕的做法(如果可能的话),我想你需要完全不同的设计来实现你想要的东西。

强制将TContract作为一个界面似乎是胡说八道。不要误解我的意思,但是接口不能被实例化。将它们理解为纯粹的契约,仅此而已,它们(主要)只执行行为。但它们不是类型,也不是类。你应该试着解释一下为什么你希望它是接口。对不起,我不知道为什么我说的是接口,我的意思是抽象类。你愿意详细说明一下为什么它不起作用吗?我们已经使用了相当一段时间了,我只是在寻找一种改进它的方法。如果你说的是GetComponent,那么可能就是这样,它实际上在另一个类中,我只是把它放在那里来简化问题。