[英]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.