本文介紹不同類型的方法,在代碼中的執(zhí)行順序問題:
- 構(gòu)造方法
- 普通方法(暫用common代替)、虛方法(Virtual修飾)、New方法(new修飾)三個優(yōu)先級相同
- overide方法(會替換virtual方法,此時virtual方法被隱藏,無法再調(diào)用到)
1. 構(gòu)造函數(shù)方法(constructor)優(yōu)先級最高,new/common/virtual/這三個修飾的方法優(yōu)先級相同
- 當(dāng)父類、子類中的方法都是new/common/virtual/這三類的時候,可以理解為實例化對象的類型(等號左邊的類型)是什么,就優(yōu)先調(diào)用哪個類中的方法。
- 父類初始化之后,無法生成子類的實例化對象。因整個過程,沒有初始化子類的過程,不會生成子類對象。
文章來源:http://www.zghlxwxcb.cn/news/detail-687684.html
using ConsoleDeomAlien;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleDeomAlien
{
public class Product
{
public Product()
{
Console.WriteLine("old Constructor-------Product");
}
public void Intro()
{
Console.WriteLine("old method--------Intro\n");
}
}
public class NewProduct : Product
{
public NewProduct()
{
Console.WriteLine("new Constructor-------NewProduct");
}
// 這里使用new修飾或不用new都可以。都代表對父類進行重寫。
// 如果父類注定要被子類重寫的,父類中可以寫個空方法,后續(xù)子類直接重寫即可。
public new void Intro()
{
Console.WriteLine("new method--------Intro\n");
}
}
public class MainMethod
{
public static void Main()
{
Product p = new Product();
// 初始化和實例對象是相同的,此時該class中的方法僅僅是被重寫(未被覆蓋),改方法還起作用。
// 最終,有限調(diào)用自己class中的方法
p.Intro();
NewProduct np = new NewProduct();
// 子類優(yōu)先調(diào)用該類下面的方法。
np.Intro();
Product p_np = new NewProduct();
// 初始化對象是用的子類,但是對象是父類類型,最終會優(yōu)先調(diào)用父類的方法。
p_np.Intro();
// !!!不符合邏輯的實例化過程,因為父類初始化之后,沒有調(diào)用子類的構(gòu)造函數(shù),無法生成子類的實例對象!!!
// NewProduct np_p = new Product ();
Console.ReadKey();
}
}
}
old Constructor-------Product
old method--------Intro
old Constructor-------Product
new Constructor-------NewProduct
new method--------Intro
old Constructor-------Product
new Constructor-------NewProduct
old method--------Intro
2. virtual / override 修飾的父、子類中的方法,最終virtual方法會被覆蓋(且virtual被隱藏,無法起作用)
文章來源地址http://www.zghlxwxcb.cn/news/detail-687684.html
using ConsoleDeomAlien;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleDeomAlien
{
public class Product
{
public virtual void Intro()
{
Console.WriteLine("old method--------Intro\n");
}
}
public class NewProduct : Product
{
public override void Intro()
{
Console.WriteLine("new method--------Intro\n");
}
}
public class MainMethod
{
public static void Main()
{
Product p = new Product();
p.Intro();
NewProduct np = new NewProduct();
np.Intro();
// 雖然實例對象是父類,但是調(diào)用不到父類的方法了,因為被隱藏了。
Product p_np = new NewProduct();
p_np.Intro();
Console.ReadKey();
}
}
}
old method--------Intro
new method--------Intro
new method--------Intro
- 構(gòu)造方法的優(yōu)先級最高
- 父類中的void方法會被子類中的普通(common)方法或virtual 方法覆蓋。virtual & common 同等級。
- 當(dāng)子類中沒override的時候,new會覆蓋virtual / common
- 當(dāng)override存在時,virtual會被替代掉(virtual可以父類無法調(diào)用到virtual中的方法)
到了這里,關(guān)于C#---第二十:不同類型方法的執(zhí)行順序(new / virtual / common / override)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!