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:從零開始的軟體開發生活」
請大家繼續支持 ^_^