C# 从另一个构造函数调用构造函数

C# 从另一个构造函数调用构造函数,c#,java,oop,C#,Java,Oop,我想做这样的事情 public class Class1 { public Class1() { } public Class1(int a) { } } public class Class2 :Class1 { public Class2(int a) { } public Class2(): base(2)

我想做这样的事情

public class Class1
    {
       public Class1()
       {

       }
       public Class1(int a)
       {

       }
    }
   public class Class2 :Class1
    {
       public Class2(int a)
       {

       }
       public Class2(): base(2)
       {
         this(2);   // new Class2(2);
       }

    }
我知道这在Java中是无法实现的(可以在第一行中使用介于(super或this)之间的一个)

但不知何故,我需要这样的工作——如何实现这一点?意味着在派生类的默认构造函数中调用基类的参数化构造函数和派生类的参数化构造函数。

对构造函数的调用非常好。以下是一些相关信息:

构造函数可以使用base关键字 调用基的构造函数 类。
..
构造函数可以调用另一个构造函数 在同一对象中使用 这个关键字是什么。就像基地一样,这个可以 可以使用参数,也可以不使用参数, 以及构造函数中的任何参数 可作为此的参数使用, 或者作为表达式的一部分

这应该起作用:

public class Class1
{
   public Class1()
   {

   }
   public Class1(int a)
   {

   }
}
public class Class2 :Class1
{
   public Class2(int a) : base(a)
   {

   }
   public Class2(): this(2)
   {
   }

}

Igor的回答是一个很好的例子,说明了在这种情况下应该如何编写构造函数。解决最后一句中更一般的情况:不能链接到多个构造函数。不能在当前类中调用基构造函数和另一个构造函数

重载构造函数有两种典型模式。在第一种模式中,派生类的重载集与基类的重载集大致匹配——您试图让派生类感觉它是继承构造函数的,这是有效的。(构造函数本身不是继承的,但是如果您提供相同的签名,那么调用者就会觉得它是继承的。)当您的派生类不需要额外信息时,通常会出现这种情况。当然,每个构造函数都可以有额外的参数,并且只向上传递一个子集给基构造函数,但这可能会变得复杂

在第二种模式中,派生类中有几个构造函数,每个构造函数在同一(派生)类中调用一个“主”构造函数。这个主构造函数的参数最多,因为它需要能够处理任何其他构造函数指定的所有内容。有时主构造函数应该是私有的,如果某些组合没有意义,但是当您知道只能通过合理的公共构造函数访问代码时,可以方便地在一个地方指定主构造函数。在这种情况下,只有“主”构造函数直接链接到基类构造函数。当派生类具有基类所需之外的多条附加信息时,通常会使用此方法


有这种模式的混合体,其中您有多个主控器,多组重载调用主控器。。。但我建议你尽量保持简单。还可以考虑提供静态工厂方法代替构造函数的可能性,这可能会导致更多的可读代码,因为你可以用它们的目的/参数来命名方法——参见<代码> TimeSIP.从分钟例如.

这两种语言都是不可能的(因为一个很好的理由)。否则,如果没有显式的base或this,那么由于隐式的base调用,您将多次调用base构造函数。这可能会导致不必要的行为。

编写多个构造函数和一个Init()方法


在每个构造函数中,您可以编写在将其传递给Init方法之前需要执行的任何代码。

我在这里看到的唯一可能的问题是,如果您不想要
Class2(inta):base(a)
,但确实想要
Class2():base(2)
。然而,我想不出这样一个决定是最好的设计的类结构。我知道,但我想在派生类的默认构造函数中执行其中的两个,即我想执行基的参数化构造函数,以及通过派生类的默认构造函数派生的参数化构造函数(可以在定义中写入)对吧,不能这样做,只能调用另一个构造函数,不能同时调用这两个构造函数。我想你应该重新考虑一下需要以这种方式调用构造函数的设计。这就是我想知道的,如果我们能以某种方式做到这一点,也如果你能让我更好地理解为什么JAVA和C中都没有给出这种类型的东西。我们可以使用Like public Class2(inta):base(a),但不能用于定义派生类的默认构造函数。这对我来说也很好。但是,如果我们调用同一个base construtorA构造函数的时间越长,那么该构造函数应该只运行一次,这有什么害处呢。如果只是简单的初始化,比如设置默认变量,那么就没有问题(除了性能问题,因为任务执行了两次),但是如果要在构造函数中填充一个列表,那么所有条目都有两次。我认为有更好的理由,对我来说,这只是感觉不安全。也许有人能提供一个更好的例子?