【问题标题】:Call base constructor and other constructor in constructor在构造函数中调用基构造函数和其他构造函数
【发布时间】:2011-06-16 07:10:36
【问题描述】:

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

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

但这种表示法不起作用。 有什么办法可以解决吗?

【问题讨论】:

  • 如果您的无参数构造函数 (this()) 指定了一个不同的基类构造函数(它隐式执行的 - 无参数构造函数 - 如果未指定)会怎样。应该调用哪个基类构造函数?

标签: c# .net inheritance constructor


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    这与不能调用 base(...) 两次的原因相同。

    【讨论】:

    • 好的,我明白为什么不能像我尝试的那样解决它。所以看来我必须使用一种解决方法。
    • 请仔细阅读所有其他人的答案
    【解决方案3】:

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

    【讨论】:

    • 在构造函数中调用虚方法通常不是很好的风格。
    • 您的意思是“让基类调用某事”还是“让基类调用某事”?另外,为什么要覆盖基类中的虚函数?虚函数将在子类中被覆盖。
    • 调用虚拟方法并不是解决这个问题的好方法。请参阅:blogs.msdn.com/b/ericlippert/archive/2008/02/18/… 和 Eric 于 2008 年 2 月 18 日下午 6:50 发表的评论
    【解决方案4】:

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

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

    【讨论】:

    • 用于实现复制构造函数。这样我就可以调用无参数构造函数的“默认东西”并且可以调用基本构造函数。
    • 你不能把无参数构造函数的“默认东西”放在基础中吗?或者只是将它复制到另一个构造函数?
    【解决方案5】:

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

    【讨论】:

    • 感谢您的帖子。是的,这是我考虑过的解决方案。但我希望可能有一个解决方案,比如在构造函数中调用 base() 和 this(),就像在例如Java。
    【解决方案6】:

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

    private int foo_ = 41;
    

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

    【讨论】:

      【解决方案7】:

      其实,你可以这样做, 您可以从子类实例中触发父类构造函数,方法如下:

      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;
      }
      

      现在,假设您正在从学生类创建一个对象, 所以,你会这样做:

      students std = new students ("Jack", 23);

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

      希望对您有所帮助, 干杯。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-21
        • 2018-10-17
        • 2010-09-25
        • 2017-04-01
        • 2016-07-19
        • 1970-01-01
        • 1970-01-01
        • 2018-01-31
        相关资源
        最近更新 更多