【问题标题】:How to avoid implementing empty constructors in derived classes?如何避免在派生类中实现空构造函数?
【发布时间】:2013-08-18 12:33:41
【问题描述】:

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

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

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

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

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

我必须使用这些参数实现上述所有构造函数,然后调用: base(...) 将它们转发到派生类。这导致许多类具有空的构造函数。似乎有很多浪费的代码。

【问题讨论】:

  • 我唯一能想到的就是制作static 方法而不是实例构造函数。例如public static T Create<T>(string Arg1, string Arg2) where T : BaseTool, new() { var instance = new T(); /* do stuff, to instance. */ return instance; }。这可以称为var newDT = BaseTool.Create<DerivedTool>("foo", "bar");
  • @JeppeStigNielsen:如果您将其发布为答案,我会支持它:-)
  • @dtb 我作为答案发布。

标签: c# constructor


【解决方案1】:

构造函数不是从基类继承的,因此无法在每个派生类中声明所有构造函数。但是,您可以使用例如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"); 优雅。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 2011-09-27
      相关资源
      最近更新 更多