C#構(gòu)造函數(shù)在基類和父類中的執(zhí)行順序
一、簡(jiǎn)介
當(dāng)我們沒(méi)有在子類構(gòu)造函數(shù)中寫(xiě)上 base(),默認(rèn)會(huì)先調(diào)用父類中無(wú)參的構(gòu)造函數(shù),再調(diào)用子類。
當(dāng)在有參構(gòu)造函數(shù)后寫(xiě)上base時(shí),只調(diào)用子類構(gòu)造函數(shù)中有參的構(gòu)造函數(shù),隱藏父類無(wú)參構(gòu)造函數(shù)。
二、代碼案例
父類代碼:
#region 父類
/// <summary>
/// 測(cè)試構(gòu)造函數(shù)——需要被構(gòu)造類 Fu
/// </summary>
class Fu
{
private int x;//一個(gè)簡(jiǎn)單的私有字段
/// <summary>
/// 構(gòu)造函數(shù)
/// </summary>
public Fu()
{
Console.WriteLine("會(huì)先調(diào)用這里:這是父類");
}
/// <summary>
/// 父類中的有參構(gòu)造方法
/// </summary>
/// <param name="x"></param>
public Fu(int x)
{
this.x = x;
Console.WriteLine("x賦值完成");
}
/// <summary>
/// 父類構(gòu)造C函數(shù)
/// </summary>
/// <param name="x"></param>
/// <param name="b"></param>
/// <param name="c"></param>
public Fu(int x, int b, string c)
{
this.x = x;
Console.WriteLine("x賦值完成" + x + b + c);
}
/// <summary>
/// 具有7個(gè)參數(shù)的構(gòu)造函數(shù)
/// </summary>
/// <param name="a"></param>
/// <param name="a1"></param>
/// <param name="a2"></param>
/// <param name="a3"></param>
/// <param name="a4"></param>
/// <param name="a6"></param>
/// <param name="a5"></param>
public Fu(int a, int a1, int a2, int a3, int a4, int a6, int a5)
{
Console.WriteLine("最長(zhǎng)參數(shù)構(gòu)造運(yùn)行");
Console.WriteLine(a + "|" + a1 + "|" + a2 + "|" + a3 + "|" + a4 + "|" + a5 + "|" + a6 + "|"); //在函數(shù)中讓傳入?yún)?shù)對(duì)Fu類對(duì)象進(jìn)行初始化
//例如有如下多個(gè)私有字段,在類對(duì)象初始化的時(shí)候,對(duì)其變量初始化。用構(gòu)造函數(shù)最為簡(jiǎn)單
this.a = a; //傳入?yún)?shù),在對(duì)象實(shí)例化后,對(duì)其私有變量進(jìn)行賦值操作
this.a1 = a;
this.a2 = a;
this.a3 = a;
this.a4 = a;
this.a5 = a;
this.a6 = a;
}
private int a;
private int a1;
private int a2;
private int a3;
private int a4;
private int a5;
private int a6;
}
#endregion子類代碼:
#region 子類
/// <summary>
/// 派生類繼承父類
/// </summary>
class Derived : Fu
{
/// <summary>
/// 會(huì)先調(diào)用父類的構(gòu)造函數(shù),然后再調(diào)用子類這邊的有參構(gòu)造函數(shù)
/// </summary>
//先調(diào)用父類無(wú)參,再調(diào)用子類無(wú)參
//當(dāng)我們沒(méi)有在子類構(gòu)造函數(shù)中寫(xiě)上 base(),默認(rèn)會(huì)先調(diào)用父類中無(wú)參的構(gòu)造函數(shù),再調(diào)用子類。
public Derived() //: base() //重新構(gòu)造 :調(diào)用父類中無(wú)參的構(gòu)造函數(shù),在這里寫(xiě)不寫(xiě)調(diào)用結(jié)果一致
{
Console.WriteLine("這是派生類-無(wú)參-構(gòu)造函數(shù)");
}
private int y;
/// <summary>
/// 構(gòu)造函數(shù)
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// 當(dāng)我們沒(méi)有在子類構(gòu)造函數(shù)中 寫(xiě)上 base(),默認(rèn)會(huì)先調(diào)用父類中無(wú)參的構(gòu)造函數(shù)
/// 當(dāng)在有參構(gòu)造函數(shù)后寫(xiě)上base時(shí),只調(diào)用子類構(gòu)造函數(shù)中有參的構(gòu)造函數(shù),隱藏父類無(wú)參構(gòu)造函數(shù)
public Derived(int x, int y) /*: base(x)*/
{
this.y = y;
Console.WriteLine("這是y賦值完成");
}
/// <summary>
/// 多參數(shù)
/// </summary>
/// <param name="x"></param>
/// <param name="a"></param>
public Derived(int x, string a)// : base(x, x, x, x, x, x, x) //這里寫(xiě)了 base 會(huì)先調(diào)用父類,再調(diào)用當(dāng)前子類進(jìn)行構(gòu)造
{
y = x;
Console.WriteLine(a + "第三方法");
}
}
#endregionMain()調(diào)用:
#region Main 入口
/// <summary>
/// 程序
/// </summary>
class Program
{
/// <summary>
/// 主入口
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
Derived d = new Derived();
Console.WriteLine("-----------------------以上為無(wú)參構(gòu)造------------------------------------------");
Derived d1 = new Derived(1, 2);
Console.WriteLine("-----------------------以上為2個(gè)參數(shù)構(gòu)造---------------------------------------");
Derived d2 = new Derived(1, "1");
Console.WriteLine("-----------------------以上為2個(gè)參數(shù)構(gòu)造,6個(gè)私變量----------------------------");
//先調(diào)用有參的構(gòu)造函數(shù)一旦被調(diào)用,無(wú)參的構(gòu)造函數(shù)都不會(huì)被調(diào)用了
//先執(zhí)行父類的構(gòu)造函數(shù),才執(zhí)行子類的
Console.ReadLine();
}
}
#endregion三、輸出結(jié)果
會(huì)先調(diào)用這里:這是父類 這是派生類-無(wú)參-構(gòu)造函數(shù) -----------------------以上為無(wú)參構(gòu)造------------------------------------------ 會(huì)先調(diào)用這里:這是父類 這是y賦值完成 -----------------------以上為2個(gè)參數(shù)構(gòu)造--------------------------------------- 最長(zhǎng)參數(shù)構(gòu)造運(yùn)行 1|1|1|1|1|1|1| 1第三方法 -----------------------以上為2個(gè)參數(shù)構(gòu)造,6個(gè)私變量----------------------------
到此這篇關(guān)于C#構(gòu)造函數(shù)在基類和父類中執(zhí)行順序的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用C#程序驗(yàn)證系統(tǒng)登錄用戶與目錄權(quán)限
這篇文章主要介紹了使用C#程序驗(yàn)證系統(tǒng)登錄用戶與目錄權(quán)限,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
C#實(shí)現(xiàn)六大設(shè)計(jì)原則之單一職責(zé)原則
這篇文章介紹了C#實(shí)現(xiàn)六大設(shè)計(jì)原則之單一職責(zé)原則的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02
Unity編輯器預(yù)制體工具類PrefabUtility常用函數(shù)和用法
這篇文章主要為大家介紹了Unity編輯器預(yù)制體工具類PrefabUtility常用函數(shù)及用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
C#迭代器模式(Iterator Pattern)實(shí)例教程
這篇文章主要介紹了C#迭代器模式(Iterator Pattern),包括了迭代器的適用范圍及用法實(shí)例,需要的朋友可以參考下2014-09-09
C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已安裝軟件變化的方法
這篇文章主要介紹了C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已安裝軟件變化的方法,涉及C#針對(duì)注冊(cè)表的讀取與監(jiān)控技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-08-08

