【问题标题】:Improve this generic abstract class改进这个通用抽象类
【发布时间】:2010-05-14 17:38:09
【问题描述】:

我有以下抽象类设计,我想知道是否有人可以提出任何改进,以加强我们的要求执行或简化 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() 作为通用约束,因为构造函数应标记为内部)

【问题讨论】:

  • 强制 TContract 作为一个接口似乎是无稽之谈。不要误会我的意思,但是接口不能被实例化。将它们理解为仅仅是合同,仅此而已,它们(主要)仅强制执行行为。但它们不是类型,也不是类。您应该尝试解释为什么您希望它成为界面。
  • 对不起,我不知道为什么我说接口,我是说抽象类
  • 您能否详细说明为什么它不起作用?
  • 我们已经使用了一段时间了,我只是在寻找一种改进它的方法。
  • 如果你说的是GetComponent那么可能是这样,它实际上是在另一个类中,我只是把它放在那里以简化问题。

标签: c# generics oop interface


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-08-07
    • 2013-06-07
    • 1970-01-01
    • 2023-01-28
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多