C#中的覆蓋和隱藏
阿新 • • 發佈:2019-02-07
在C++中過載、覆蓋、隱藏很讓人迷糊,剛開始接觸C#的時候關於這個用法也讓我轉了一陣子,今天有時間把我對他們的理解記錄了下來,還請各位指正。
在C++中他們是這樣定義的:
概念 |
範圍 |
引數 |
基類中為virtual? |
不同
y/n
覆蓋override 繼承相同
y
隱藏hide 繼承相同
n
不同
y/n
覆蓋和重寫(override)是一個意思:
主要是指你在基類裡面定義了一個virtual函式,在派生類中重新實現了這個函式.這就叫覆蓋或者重寫
隱藏有兩種情況:
(1)如果派生類的函式與基類的函式同名,但是引數不同。此時,不論有無virtual關鍵字,基類的函式將被隱藏(注意別與過載混淆)。
(2)如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有virtual 關鍵字。此時,基類的函式被隱藏(注意別與覆蓋混淆)
下面參照例項看一下:
1、覆蓋
/** 覆蓋方法的測試
*/
publicclass Base_Override {
publicvirtualvoid Introduce(){
System.Console.WriteLine("I'm Base_Override_Introduce()");
}
publicvirtualvoid SayHi() {
System.Console.WriteLine("I'm Base_Override_SayHi()");
}
}
publicclass Derive_Override:Base_Override{
publicoverridevoid Introduce()
{
System.Console.WriteLine("I'm Derive_Override_Introduce()");
//base.Introduce();
}
//注意,此方法沒有 override 父類的方法
//編譯時有警告,建議新增override或new
//此方法C#中預設為隱藏,在C++這種情況應該不是隱藏 應該資料覆蓋
publicvoid SayHi() {
System.Console.WriteLine("I'm Derive_Override_SayHi()");
}
publicvoid SayHi(bool b) {
System.Console.WriteLine("I'm Derive_Override_SayHi(bool b)");
}
}
測試程式碼如下:
Base_Override base_override =new Base_Override();Derive_Override derive_override =new Derive_Override();
//將呼叫Base_Override中Introduce()
base_override.Introduce();
//將呼叫Base_Override中SayHi()
base_override.SayHi();
//將呼叫Derive_Override中Introduce()
derive_override.Introduce();
//將呼叫Derive_Override中SayHi()
derive_override.SayHi();
//將呼叫Derive_Override中SayHi(bool b)
derive_override.SayHi(true);
base_override =new Derive_Override();
//將呼叫Derive_Override中Introduce()
base_override.Introduce();
//將呼叫Base_Override中SayHi()
//** 在C++可能依然是Derive_Override中SayHi() OK
base_override.SayHi();
//將呼叫Derive_Override中SayHi()
((Derive_Override)base_override).SayHi();
//compile Error!
//base_override.SayHi(true);
2、隱藏
/** 隱藏方法的測試
*/
publicclass Base_New {
publicvoid Introduce()
{
System.Console.WriteLine("I'm Base_New_Introduce()");
}
publicvoid SayHi()
{
System.Console.WriteLine("I'm Base_New_SayHi()");
}
}
publicclass Derive_New : Base_New {
// 沒有加new,但C#預設行為會加上new
//編譯時有警告,建議新增override或new
publicvoid Introduce()
{
System.Console.WriteLine("I'm Derive_new_Introduce()");
}
// 顯式加上new,跟不加new實際效果一樣,只是加new之後會消除compile warning
publicnewvoid SayHi()
{
System.Console.WriteLine("I'm Derive_new_SayHi()");
}
}
測試程式碼如下:
Base_New base_new =new Base_New();Derive_New derive_New =new Derive_New();
//將呼叫Base_New中Introduce()
base_new.Introduce();
//將呼叫Base_New中SayHi()
base_new.SayHi();
//將呼叫Derive_New中Introduce()
derive_New.Introduce();
//將呼叫Derive_New中SayHi()
derive_New.SayHi();
base_new =new Derive_New();
//將呼叫base_new中Introduce()
base_new.Introduce();
//將呼叫base_new中SayHi()
base_new.SayHi();
根據測試結果,可以說明c#中的覆蓋和隱藏的區別。並且經過在C++中的同樣測試,由於C++沒有override 和 new 關鍵字約束,所以C#與C++中的用法依然存在著細微的不同。。
以上,可能存在理解錯誤的地方,還請各位網友指正。。