改进这个通用抽象类

时间:2010-05-14 17:38:09

标签: c# generics oop interface

我有以下抽象类设计,我想知道是否有人可以在强化执行我们的要求或简化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)

1 个答案:

答案 0 :(得分:0)

有一种方法可以强制TType作为具体类并同时禁止构造函数成功。我想可能尝试实例化TType,只有当它是具体类型时才会成功,但是,你想要避免实例化。我建议尝试从构造函数中抛出异常。在您的控制器基础中,您可以使用异常处理代码包围实例化。只有当你实例化具体类型时才会通过编译时间,如果你抛出异常它将通过运行时...这是整体不好的做法(如果可能的话),我想你需要完全不同的设计来实现你在寻找什么