[.NET]Override VS. Shadow

Override VS. Shadow的相關說明

當父類別的test Method有允許子類別去Override它,如下,

class C1
{
	public virtual string test(string s)
	{
		return "C1 string";
	}
}

class C11 : C1
{
	public override string test(string s)
	{
		return "C11 string";
	}
}

 

那如果建立出一個子類別變數(myC11),而將它Assign給父類別的變數(myC1),再呼叫myC1 的 test Method的話,會Call到父類別的,還是子類別的test Method呢?

C11 myC11 = new C11();
MessageBox.Show(myC11.test("")); //C11 string
C1 myC1 = myC11;
//override,所以還是使用C11
MessageBox.Show(myC1.test("")); //C11 string

不管是myC11 or myC1 都是會Call 子類別的 test Method哦!

 

當父類別的test Method為non-virtual時,子類別可以Shadow它,如下,

class C3
{
	public string test(string s)
	{
		return "C3 string";
	}
}

class C33 : C3
{
	public new string test(string s)
	{
		return "C33 string";
	}
}

如果在C33的test Method中沒有加入 new 的話,會有以下的警告,

'C33.test(string)' hides inherited member C3.test(string)'.
Use the new keyword if hiding was intended.
    

 

那如果建立出一個子類別變數(myC33),而將它Assign給父類別的變數(myC3),再呼叫 myC3 的 test Method 的話,會Call到父類別的,還是子類別的 test Method 呢?

//HidebySig
C33 myC33 = new C33();
MessageBox.Show(myC33.test("")); //C33 string
C3 myC3 = myC33;
//發現是HidebySig,所以當myC33轉成父類別時,會忽略子類別的Method
MessageBox.Show(myC3.test("")); //C3 string

如果子類別是HidebySig(Shadow)父類別的Method,當子類別變數Assign給父類別變數後,呼叫父類別變數的 test Method,會直接Call 父類別的 test Method哦!

 

參考資料

.NET Puzzles, Gotchas & Cautionary Tales

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^