1. 程式人生 > >C#中的覆蓋和隱藏

C#中的覆蓋和隱藏

在C++中過載、覆蓋、隱藏很讓人迷糊,剛開始接觸C#的時候關於這個用法也讓我轉了一陣子,今天有時間把我對他們的理解記錄了下來,還請各位指正。

在C++中他們是這樣定義的:

概念

範圍

引數

基類中為virtual?

過載overload 同一個類中

不同

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++中的用法依然存在著細微的不同。。

以上,可能存在理解錯誤的地方,還請各位網友指正。。