C# 调用构造函数中的基构造函数和其他构造函数

C# 调用构造函数中的基构造函数和其他构造函数,c#,.net,inheritance,constructor,C#,.net,Inheritance,Constructor,标题听起来可能令人困惑。 我想要的是调用同一类的构造函数和构造函数中基类的构造函数。 也许我第一次尝试解决这个问题可以解释我的问题: public MyClass(MyClass obj) : base(obj),this() {} 但是这个符号不起作用。 有什么解决方法吗?您只需将构造函数代码复制到给定的构造函数中即可。或者创建一个从默认构造函数和此构造函数调用的特殊setup()函数。对此没有技术解决方案,您需要解决方法,将逻辑移出默认构造函数,将基调用设为虚拟函数,而不是在超类中重写。在

标题听起来可能令人困惑。 我想要的是调用同一类的构造函数和构造函数中基类的构造函数。 也许我第一次尝试解决这个问题可以解释我的问题:

public MyClass(MyClass obj) : base(obj),this() {}
但是这个符号不起作用。
有什么解决方法吗?

您只需将构造函数代码复制到给定的构造函数中即可。或者创建一个从默认构造函数和此构造函数调用的特殊setup()函数。

对此没有技术解决方案,您需要解决方法,将逻辑移出默认构造函数,将基调用设为虚拟函数,而不是在超类中重写。

在C#中,还可以在声明中为每个成员提供默认初始化:

private int foo_ = 41;

这解决了许多使用其他构造函数的问题。

不,您不能这样做,原因如下:


当构造函数调用其基的构造函数时,后一个调用就是所讨论的构造函数的一部分。因此,您不能调用同一类的另一个构造函数和基类的构造函数,因为前一个调用已经包含对基类构造函数的调用-您不能两次初始化基类

一种方法是使
MyClass
的无参数构造函数调用
base(obj)
。 但如果你不总是想这样做,我认为没有好办法

也许你可以试着在那些构造器中移动东西。你能发布更多关于这些构造函数中实际发生了什么的信息吗?

C#允许base(…)或this(…),因为每个构造函数最终都必须调用超级构造函数。因此,如果可以同时调用base()和this(),将发生两个超级构造函数调用,这从根本上说是不正确的

这也是为什么不能调用base(…)两次的原因。

实际上,您可以这样做, 您可以从子类实例启动父类构造函数,下面是如何执行此操作:

public class Person
{
    public Person(int age) {
        this.Age = age; 
    } 
    public int Age;
}

public class students :Person
{
    public students(string name, int age) :base(age ) 
    { 
        this.studentName = name;
        this.Age = age;
    }

    public string studentName;
}
现在,假设您正在从学生类创建一个对象, 因此,您将执行以下操作:

学生std=新生(“杰克”,23岁)

这会将“Jack”发送给学生类构造函数,23会通过:base(age)发送给个人构造函数

希望这有帮助,,
干杯

谢谢你的帖子。是的,这是我考虑过的解决方案。但我希望有一种解决方案,比如在构造函数中调用base()和this(),就像在Java中一样。在构造函数中调用虚拟方法通常不是一种好的方式。你的意思是“让基类调用一些东西”,还是“让基类调用一些东西”?还有,为什么要重写基类内的虚函数?虚函数将在子类中重写。从调用虚方法不是解决此问题的好方法。请参阅:Eric在2008年2月18日6:50 PMIt上的评论是为了实现复制构造函数。这样我就可以调用无参数构造函数的“默认内容”,也可以调用基构造函数。你不能把无参数构造函数的“默认内容”放在基构造函数中吗?或者只是将其复制到另一个构造函数?如果您的无参数构造函数(
this()
)指定了另一个基类构造函数(它隐式地指定了-无参数构造函数-如果未指定),该怎么办。应该调用哪个基类构造函数?好的,我理解为什么不可能像我尝试的那样解决它。因此,我似乎不得不使用一种变通方法。请仔细阅读所有其他人的答案