2011-06-16 324 views
15

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

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

但是符号不工作。 有没有解决方案来解决这个问题?

+2

如果你的参数的构造函数('这个()')指定一个不同的基类的构造函数(它隐含那样 - 参的一个 - 如果没有指定)。应该调用哪个基类构造函数? – 2011-06-16 07:20:18

回答

12

不,你不能,原因如下做到这一点:

当一个构造函数调用它的基础的构造函数,后者调用是有问题的构造的一部分。所以,你不能调用同一个类的另一个构造和基类的构造函数,因为前者的呼叫已经包含到基本构造函数的调用 - 你不能初始化你的基地两次

1

您可以简单地将构造函数代码复制到给定的构造函数中。或者从默认的构造函数和这个构造函数中调用一个特殊的setup()函数。

+0

感谢您的信息。是的,这是我考虑的解决方案。但我希望可能有一种解决方案,比如在构造函数中调用base()和this(),就像在例如可能的情况下一样。 Java的。 – Kai 2011-06-16 07:16:42

2

这种没有技术解决方案,需要一个解决办法,将逻辑被默认的构造函数,使基地在你的超一流的呼叫比重写虚函数。

+0

在构造函数中调用虚拟方法通常不是很好的风格。 – leppie 2011-06-16 07:18:35

+0

你的意思是“让基类调用什么东西”,或者“做点基调”?另外,为什么要覆盖基类内的虚函数?虚拟函数将在子类中被覆盖。 – 2011-06-16 07:18:38

+0

调用虚拟方法不是解决此问题的好方法。参见: 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 2011-06-16 07:21:27

0

在C#中,你还可以在声明中为每个成员提供一个缺省初始化:

private int foo_ = 41; 

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

2

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

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

+0

这是为了实现复制构造函数。这样我可以调用无参数构造函数的“默认东西”,并可以调用基础构造函数。 – Kai 2011-06-16 07:19:17

+0

你不能把无参数构造函数的“默认东西”放在底部吗?或者只是将它复制到其他构造函数? – 2011-06-16 07:24:49

5

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

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

+0

好吧,我明白为什么它不可能像我试过的那样解决它。所以看来我必须使用一种解决方法。 – Kai 2011-06-16 07:21:40

+0

请仔细阅读所有其他人的答案 – Nick 2011-06-16 07:25:06

-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 =新的学生( “杰克”,23);

这将发送“杰克”学生类的构造函数,并且23将通过被发送到人的构造函数:基地(年龄)

希望这有助于, 干杯。