簡體   English   中英

簡單構造函數和帶有基數的構造函數有什么區別?

[英]What is the difference between simple constructor and constructor with base?

我對以下代碼有疑問,

public class ClassA: BaseClass
{
    public ClassA(UIElement element)
        : base(element)
    {
    }
}

public class ClassA: BaseClass
{
    public ClassA(UIElement element)
    {
    }
}

上面的代碼有什么區別?

疑問:

1,調用基礎構造函數

2,調用基本構造函數有什么用

3.如果我們不調用基本構造函數,它將隱式調用。

任何人都可以對此提出建議。

第一個指示使用BaseClass(UIElement)構造函數,而另一個指示使用BaseClass()進行初始化。

對你的問題; 這完全取決於是否可以通過傳遞的元素來初始化BaseClass。

  1. 並非總是如此,如果您未指定任何內容,則將調用base()
  2. base()就像你已經做的那樣

在每種情況下,都會調用一個基本構造函數,只是隱式地調用它,在后一種情況下使用默認值-在第一種情況下,它使用一個接受參數的顯式基本構造函數。 如果基類上不存在默認的無參數構造函數,那么如果用戶未明確調用該錯誤以提供所需的輸入,則會遇到錯誤。

因此,僅在需要將輸入傳遞給特定構造函數或未定義默認的公共構造函數時才需要調用。

1-3。 不,如果基本演義包含不帶參數2的構造函數,則不必自動調用它。您在從另一個類繼承時使用了base,繼承的部分也需要構造,因此您必須調用base構造函數

請注意使用chained contructors另外2件事

  1. 通常實際構造函數之前調用基本構造函數。
  2. 構造函數可以具有不同的可訪問性,例如私有或公共。 您不能將每個構造函數從基類鏈接到派生類。

第一個將參數傳遞給基本構造函數,而第二個使用默認值(無參數構造函數)。

public class Human
{
    public string Name { get; set; }
    public Human()
    {
        Name = "No name";
    }
    public Human(string name)
    {
        Name = name + " Jr.";
    }
}
public class Male : Human
{
    public Male() {}
    public Male(string name) : base(name) {}
}
public class Female : Human
{
    public Female() { Name = "Girl"; }
}


var unnamedHuman = new Human();
//unnamedHuman.Name == "No name"
var namedHuman = new Human("Jon");
//namedHuman.Name == "Jon"

var unnamedMale = new Male();
// unnamedMale.Name == "No name"
var namedMale = new Male("Chris");
// namedMale.Name == "Chris Jr";

var unnamedFemale = new Female()
// unnamedFemale.Name == "Girl"

邏輯:初始化子類時(通過調用其ctor),首先按順序(自上而下)調用其基類構造函數,最后一個將是您調用的子類的構造函數。 默認情況下,使用默認的無參數構造函數,但是您可以使用base(parameter1, p2)指定參數並將其傳遞給基本構造函數。

如果您的BaseClass看起來像:

public class BaseClass
{
    private readonly _element;
    public BaseClass(UIElement element)
    {
       _element = element;
    }
}

然后,您絕對必須調用基本構造函數,因為它是BaseClass唯一的構造函數。

如果是這樣的:

public class BaseClass
{
    private readonly _element;
    public BaseClass()
    {
        _element = default(UIElement);
    }
    public BaseClass(UIElement element)
    {
       _element = element;
    }
}

然后,如果要設置元素,則絕對必須調用基本構造函數,因為它只能在構造函數中設置。

如果是這樣的:

public class BaseClass
{
    private _element;
    public BaseClass()
    {
        _element = default(UIElement);
    }
    public BaseClass(UIElement element)
    {
       _element = element;
    }
    public UIElement Element
    {
      get{ return _element; }
      set{ _element = value; }
    }
}

然后,您可以選擇:

public class ClassA: BaseClass
{
    public ClassA(UIElement element)
        : base(element)
    {
    }
}

public class ClassA: BaseClass
{
    public ClassA(UIElement element)
    {
       Element = element;
    }
}

但是,前者更為清晰,並且在整個構造過程中,沒有一段時間Element返回默認值( null )。

總之,考慮到ClassA一類 BaseClass 在創建一個明智的ClassA實例時,您必須完成建立一個明智的BaseClass實例所需的所有工作。 構造函數的工作是確保這種情況發生。 盡可能多地調用基本構造函數。

暫無
暫無

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

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