在构造函数中调用基础构造函数和其他构造函数

27

标题可能有些令人困惑。

我想要在一个构造函数内部调用相同类的构造函数以及基类的构造函数。也许我的第一次尝试可以解释我的问题:

public MyClass(MyClass obj) : base(obj),this() {}

但是那个记号没用。有什么解决方案可以解决它吗?


2
如果您的无参数构造函数(this())指定了不同的基类构造函数(如果未指定,则隐式指定为无参数构造函数),那么应该调用哪个基类构造函数? - Damien_The_Unbeliever
7个回答

22

不行,你不能这样做,原因如下:

当一个构造函数调用其基类的构造函数时,后者的调用是该构造函数的一部分。因此,你不能调用同一类的另一个构造函数以及基类的构造函数,因为前者的调用已经包含了对基类构造函数的调用 - 你不能初始化基类两次。


8

C#允许使用base(...)或this(...),因为每个构造函数最终都必须调用一个超类构造函数。因此,如果同时调用base()和this(),将会有两个超类构造函数的调用,这是基本上不正确的。

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


好的,我明白为什么不能像我尝试的那样解决它。所以看来我必须使用一个变通方法。 - Kai
请仔细阅读其他人在备选方案上的答案。 - Nick

2
没有针对此问题的技术解决方案,您需要使用一种变通方法,将逻辑移出默认构造函数,使基本调用成为虚函数,然后在您的超类中进行覆盖。

1
在构造函数中调用虚方法通常不是一个好的编程风格。 - leppie
你是指“使基类调用某些东西”,还是“使基础调用某些东西”?此外,为什么应该在基类中重写虚函数?虚函数应该在子类中被重写。 - Sebastian Mach
从中调用一个虚方法并不是解决这个问题的好方法。请参见: http://blogs.msdn.com/b/ericlippert/archive/2008/02/18/why-do-initializers-run-in-the-opposite-order-as-constructors-part-two.aspx 以及埃里克在2008年2月18日下午6:50的评论。 - thekip

2
一种方法是使MyClass的无参构造函数调用base(obj)。但如果你不总是想这样做,那么我认为没有好的方法。 也许你可以尝试在这些构造函数中移动一些内容。你能否发布更多关于这些构造函数实际发生了什么的信息?

这是用于实现复制构造函数的。这样我就可以调用无参构造函数的“默认内容”,并调用基础构造函数。 - Kai
你不能把无参构造函数的“默认内容”放在基类中吗?或者只需将其复制到另一个构造函数中? - Petar Ivanov

1
你可以直接将构造函数的代码复制到给定的构造函数中。或者创建一个特殊的setup()函数,该函数从默认构造函数和此构造函数中调用。

感谢您的帖子。是的,这是我考虑过的一个解决方案。但我希望可能有一种解决方案,就像在Java中可以在构造函数中调用base()和this()一样。 - Kai

0
在C#中,您还可以为每个成员在声明中提供默认初始化:
private int foo_ = 41;

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


-2

实际上,你是可以这样做的, 你可以从子类实例中调用父类构造函数,以下是具体方法:

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 = new 学生("杰克", 23);
这将把"杰克"发送到学生类的构造函数,并通过:base(age)将23发送到Person构造函数。
希望这能帮到你, 祝好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接