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

时间:2011-06-16 07:10:36

标签: c# .net inheritance constructor

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

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

但这种符号不起作用。 有没有解决办法?

7 个答案:

答案 0 :(得分:14)

不,由于以下原因,你不能这样做:

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:2)

没有针对此的技术解决方案,您需要一种解决方法,将逻辑移出默认构造函数,使基本调用成为虚拟函数,而不是覆盖超类。

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

private int foo_ = 41;

这解决了许多use-other-constructor问题。

答案 6 :(得分:-1)

实际上,你可以这样做, 您可以从子类实例触发父类构造函数,以下是您的操作方法:

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 =新生(" Jack",23);

这将发送"杰克"学生类构造函数,23将通过:base(age)

发送给Person构造函数

希望这个帮助, 干杯。