簡體   English   中英

為什么不能創建一個抽象類實例,卻可以調用其構造函數?

[英]Why cannot ceate an abstract class instance but can invoke its constructor?

我知道我們不能創建一個抽象類的實例,但我不明白為什么可以使用base調用抽象類的構造函數。

abstract class Fruit
{
    public string Name { get; private set; }

    public Fruit(string name)
    {
        Name = name;
    }
}

class Apple : Fruit
{
    public Apple(string name) : base(name) { }
}


Fruit f = new Fruit("Fruit");  // Coimple Error
Apple a = new Apple("Apple");  // Success
  • base關鍵字是否僅調用構造函數,方法等?

  • 創建實例調用構造函數之間有什么區別?

提前致謝。

只有派生類(例如Apple)才能使用特殊的base字調用其父類(抽象類)的構造函數。 構造函數不能直接調用(調用)。

該基本關鍵字是否僅調用構造函數,方法等?

不可以,只要您想顯式調用父類的方法並避免在派生類中調用重寫,就可以使用它。 雖然: base(...)語法是構造函數專有的,但通常您會調用base.method();

創建實例和調用構造函數之間有什么區別?

使用new運算符創建實例有很多事情:

  • 為對象分配內存
  • 初始化字段
  • 然后最后調用構造函數,如果指定,它將首先調用基本構造函數。

關於此順序的更深入的解釋是在此答案中: https//stackoverflow.com/a/1882778/360211,但這足以解釋差異。

我要補充一點,抽象類可以提供構造函數這一事實並不意味着它還不是抽象的。

根據定義,抽象類是其中某些成員或某些成員不提供默認實現的類,派生類必須為這些成員提供實現。 另一方面,由於抽象類的某些成員只是簽名 (整個抽象成員),因此代碼一定不能實例化該類。

但是,如果派生類(無論是抽象類還是具體類)無法調用基本抽象類構造函數,則抽象類將缺少多態構造函數,並且即使有可能無法初始化類屬性或定義默認的類初始化代碼,即使該代碼調用了抽象方法或屬性。

這就是為什么即使類是抽象類,派生類也可以調用父類構造函數的原因!

創建實例和調用構造函數之間有什么區別?

我們可能會嘗試通過對底層細節的深入解釋來解決該問題,但我認為這更多是概念性問題,而不是底層問題。

如果需要摘要,則調用構造函數類實例化過程的一部分。 創建實例后將調用此方法,並在其他任何代碼使用該實例之前使用自定義代碼初始化實例。

當在構造函數中使用base關鍵字調用父類時,您只是將構造函數調用從最派生的類鏈接到基類。

使用new關鍵字創建實例會創建一個新對象並返回對該對象的引用。使用base關鍵字調用構造函數不會創建對該對象的引用(它們都不會創建實際的對象),它只會執行構造函數中的代碼。

深入了解此答案以獲取更多信息https://stackoverflow.com/a/14453366/3789232

暫無
暫無

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

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