2013-08-18 76 views
3

我有一个基类,有大量的派生类,基类有几个构造函数。在所有派生类中,我必须实现空构造函数来将参数转发给基构造函数。是否有可能以某种方式告诉C#使用派生的构造函数?如何避免在派生类中实现空构造函数?

例如,如果使用这个基类。

class BaseTool 
{ 
     public BaseTool(string Arg1, string Arg2) 
     { 
      // do stuff. 
     } 

     public BaseTool(string Arg1) 
     { 
      // do stuff. 
     } 

     public BaseTool(int Arg1) 
     { 
      // do stuff. 
     } 
    } 

我会实现所有这些参数的构造函数上面,然后调用: base(...)将它们转发到派生类。这导致了很多具有空构造函数的类。看起来像很多浪费的代码。

+2

我唯一能想到的是制作静态方法而不是实例构造函数。例如'public static T Create (string Arg1,string Arg2)其中T:BaseTool,new(){var instance = new T();/*做些东西,比如说。 * /返回实例; }'。这可以称为'var newDT = BaseTool.Create (“foo”,“bar”);'。 –

+1

@JeppeStigNielsen:如果您将该帖子发布为答案,我会对其投诉:-) – dtb

+0

@dtb我发布为答案。 –

回答

4

构造函数没有从基类继承,所以没有办法在每个派生类中声明所有的构造函数。但是,您可以使用例如T4 Templates自动执行此重复性任务。

2

(从评论的推动下,由请求。)

我能想到的是使静态方法,而不是实例构造函数的唯一的事情。因此,例如:

class BaseTool 
{ 
    public static T Create<T>(string Arg1, string Arg2) where T : BaseTool, new() 
    { 
    var instance = new T(); 
    // do stuff, to instance (which is a BaseTool) 
    return instance; 
    } 

    public static T Create<T>(string Arg1) where T : BaseTool, new() 
    { 
    var instance = new T(); 
    // do stuff, to instance (which is a BaseTool) 
    return instance; 
    } 

    public static T Create<T>(int Arg1) where T : BaseTool, new() 
    { 
    var instance = new T(); 
    // do stuff, to instance (which is a BaseTool) 
    return instance; 
    } 
} 

这可以被称为:或

var newDT = BaseTool.Create<DerivedTool>("foo", "bar"); 

,一些BaseTool内(自方法继承,而相比之下,构造函数),只是:

var newDT = Create<DerivedTool>("foo", "bar"); 

我知道它不如var newDT = new DerivedTool("foo", "bar");那么优雅。

相关问题