簡體   English   中英

關於C#中構造函數的幾個問題

[英]Few questions about constructors in C#

在C#中關於構造函數的繼承:

  1. 我已經讀過構造函數不能被繼承。
  2. 如果基類包含一個或多個構造函數,派生類必須始終調用其中一個? 派生類不可能跳過基類的構造函數嗎?
  3. 派生類可以有自己的構造函數,但必須調用其中一個基類構造函數。

這些陳述是否更正?

  1. 是的,你是對的,構造函數不是繼承的。 因此,只是因為Object具有無參數構造函數,這並不意味着String具有無參數構造函數。 從C#4規范的1.6.7.1節:

    與其他成員不同,實例構造函數不是繼承的,並且除了在類中實際聲明的實例之外,沒有實例構造函數。 如果沒有為類提供實例構造函數,則會自動提供沒有參數的空構造函數。

  2. 是的,派生類構造函數的構造函數鏈將始終通過其基類構造函數...雖然它可能是間接的,因為它可以通過this(...)鏈接到同一類中的另一個構造函數而不是base(...) 如果你沒有指定this(...)base(...) ,那就相當於base() - 在基類中調用無參數構造函數。

有關更多信息,請參閱有關構造函數鏈接的文章

1.不能繼承構造函數,但可以鏈接構造函數。 例:

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

2.是的,例如,您無法實例化從具有所有私有構造函數的對象派生的類(Jon在其評論中在下面提到的特定場景中除外) 您不能跳過基類的構造函數,但可以有多個重載,並選擇您選擇使用的構造函數。

是的不知道這個問題是在這里。

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是的。 請參閱我之前的示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM