1.虛方法
定義:
要求在繼承中,子類重寫的方法的方法名押赊,返回值類型饺藤、參數(shù)列表相同。
關(guān)鍵字 父類virtual
,子類override
看下面的例子來(lái)理解:
virtual
:在一個(gè)基類函數(shù)聲明為 virtual
就可以在任何派生類中重寫該函數(shù)流礁。
舉個(gè)栗子:
class BaseClass {
public virtual string VirtualMethod (){
return "Method is base class";
}
}
在派生類中重寫另一個(gè)函數(shù)時(shí)涕俗,要使用 override
關(guān)鍵字 顯示聲明
class overrideClass : BaseClass
public override string VirtualMethod(){
return "Method is called in derivedclass"
}
用子類構(gòu)造(初始化) 那么就會(huì)調(diào)用子類的方法,用父類來(lái)構(gòu)造就會(huì)調(diào)用父類的方法
2.隱藏方法
定義:
如果簽名相同的方法在基類和派生類中都進(jìn)行了聲明神帅,但是該方法沒有分別聲明為virtual 和override
那么派生類就會(huì)隱藏基類方法
需要用new關(guān)鍵字
來(lái)聲明這個(gè)方法再姑。
簽名相同 : 意思是`返回值`、`方法名`找御、`形參`都相同
舉個(gè)栗子
class BaseClass{
public void baseMethod(){
}
}
class DerrivedClass : BaseClass{
public new void baseMethod(){
}
}
3. 不同點(diǎn)
1. 概念上的不同:
虛方法:
override重寫的方法元镀,會(huì)導(dǎo)致原來(lái)的方法不存在了绍填。
隱藏方法:
當(dāng)子類有一個(gè)簽名和父類相同的方法時(shí)就會(huì)把父類中的該方法隱藏掉。 隱藏只是看不到了栖疑,實(shí)際上這個(gè)方法還存在讨永。
2 調(diào)用上的不同:
虛方法的調(diào)用:
調(diào)用上,使用子類構(gòu)造的對(duì)象調(diào)用虛方法遇革,就會(huì)調(diào)用子類的方法卿闹,使用父類構(gòu)造的對(duì)象,就會(huì)調(diào)用父類的方法萝快。
隱藏方法的調(diào)用:
調(diào)用上比原, 使用子類類型的聲明調(diào)用隱藏方法,就會(huì)調(diào)用到子類的方法杠巡。若想調(diào)用被隱藏的方法量窘,需要用父類類型的聲明來(lái)調(diào)用。
調(diào)用不同的舉例
class Enemy
{
public void Move() {
Console.WriteLine("調(diào)用了 enemy的move方法");
}
public virtual void Attack() {
Console.WriteLine("enemy attac");
}
}
class Boss : Enemy
{
public override void Attack() {
Console.WriteLine("Boss Attac");
}
public new void Move() {
Console.WriteLine("Boss move");
}
}
static void Main(string[] args)
{
//---- 隱藏方法的調(diào)用----begin
Boss oneEnemy = new Boss();
oneEnemy.Move(); // 調(diào)用的是隱藏方法氢拥, 用子類的聲明來(lái)調(diào)用的蚌铜,調(diào)用的就是子類的Move。
Enemy twoEnemy = new Boss();
twoEnemy.Move(); // 調(diào)用的隱藏方法嫩海, 用父類的聲明來(lái)調(diào)用的冬殃,調(diào)用的就是父類的Move方法。
//-----------------------end
//-----虛方法的調(diào)用----- begin
用什么類型 來(lái)構(gòu)造叁怪,在調(diào)用方法的時(shí)候就會(huì)調(diào)用什么類型的方法审葬。
Enemy threeEnemy = new Enemy();
threeEnemy.Attac(); // 調(diào)用虛方法,用父類來(lái)實(shí)例化的奕谭,所以調(diào)用的是父類的Attac方法涣觉。
Enemy fourEnemy = new Boss();
fourEnemy.Attac(); // 調(diào)用虛方法,用子類來(lái)實(shí)例化的血柳,所以調(diào)用的就是子類(Boss)的Attac方法官册。
//-----虛方法的調(diào)用------end
Console.ReadKey();
}