【问题标题】:Few questions about constructors in C#关于 C# 中的构造函数的几个问题
【发布时间】:2011-04-04 07:04:06
【问题描述】:

在C#中关于构造函数的继承:

  1. 我读过构造函数不能被继承。
  2. 如果基类包含一个或多个构造函数,派生类必须总是调用其中一个吗?派生类不可能跳过基类的构造函数吧?
  3. 派生类可以有自己的构造函数,但它必须调用基类构造函数之一。

这些说法正确吗?

【问题讨论】:

    标签: c# .net inheritance constructor multiple-constructors


    【解决方案1】:
    1. 是的,你是对的,构造函数不是继承的。所以仅仅因为Object 有一个无参数的构造函数,这并不意味着String 有一个无参数的构造函数,例如。来自 C# 4 规范的第 1.6.7.1 节:

      与其他成员不同,实例构造函数不是继承的,并且一个类除了在类中实际声明的实例构造函数之外没有实例构造函数。如果没有为类提供实例构造函数,则自动提供一个没有参数的空实例构造函数。

    2. 是的,派生类构造函数的构造函数链将始终通过其基类构造函数...尽管它可能是间接的,因为它可以通过this(...) 而不是base(...) 链接到同一类中的另一个构造函数.如果不指定this(...)base(...),则相当于base() - 在基类中调用无参数构造函数。

    更多信息请查看我的article on constructor chaining

    【讨论】:

    • @Jon Skeet:谢谢,虽然我不确定我是否明白。如果我在基类中声明构造函数,根据规范,派生类将不会使用它。
    • @JeffreyZ:如果派生类构造函数隐式调用它,派生类将使用它(如果它是无参数基类构造函数并且派生类构造函数未指定this(...)base(...)) 或显式(通过直接调用 base(...))。如果您可以使用一个让您感到困惑的完整示例来编辑您的问题,那将有所帮助。 (您的第三个问题目前也有些奇怪……您可能想同时对其进行编辑。)
    • @Jon Skeet:哦,对了,我也需要显式或隐式调用它,但总是会使用基类构造函数,对吗?
    • @JeffreyZ: A 基类构造函数将始终使用,是的。
    • @fartwhif:如果它生成部分类,您可以将构造函数添加到单独的文件中,而不是编辑生成的文件。但是不,没有办法说“派生类应该有一个具有相同签名的构造函数”
    【解决方案2】:

    1.不能继承构造函数,但您可以链接构造函数。示例:

    public class DerivedClass : BaseClass {
      public DerivedClass(object arg):base(arg){}
    }
    

    2. 是的,例如,您不能实例化从具有所有私有构造函数的对象派生的类(Jon 在下面的评论中提到的特定场景除外)。您不能跳过基类的构造函数,但可以有多个重载,并选择您选择使用的构造函数。

    3.是的,不知道这里的问题是什么。

    【讨论】:

    • 第 1 点绝对正确。构造函数是继承的。
    • 在 #1 中,您是 链接 构造函数,而不是继承它们。
    • 也许我误解了继承构造函数的含义。如果不是继承,您将如何描述我在回答中写的内容?啊链接...好的,谢谢
    • 打电话?你不能构造一个 DerivedClass,而不给它一个构造函数,即你不能继承基构造函数并使用它。
    • @tia:无参数构造函数是继承的。如果您不指定 any 构造函数,编译器会生成一个无参数构造函数(调用基类无参数构造函数)。
    【解决方案3】:

    1 是

    2 你不能跳过构造函数,但我认为你不能在默认构造函数中做任何事情。就像

    public class PClass {
    
        protected PClass() {
            // do nothing
        }
    
        public PClass(int myIntArg) {
            // initialize the class
        }
    
    }
    
    public Class CClass : PClass {
    
        public CClass(string myStringArg) : base() {
            // initialize the class
        }
    
    }
    

    3 是的。请参阅我之前的示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-13
      • 2011-06-08
      • 2010-10-01
      • 2012-08-19
      • 1970-01-01
      • 2011-08-23
      相关资源
      最近更新 更多