C#中的覆蓋和隱藏

來源:互聯網
上載者:User

 

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

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

概念

範圍

參數

基類中為virtual?

重載overload 同一個類中

不同

y/n

覆蓋override 繼承

相同

y

隱藏hide 繼承

相同

n

不同

y/n

 覆蓋和重寫(override)是一個意思:
主要是指你在基類裡面定義了一個virtual函數,在衍生類別中重新實現了這個函數.這就叫覆蓋或者重寫
隱藏有兩種情況:
(1)如果衍生類別的函數與基類的函數同名,但是參數不同。此時,不論有無virtual關鍵字,基類的函數將被隱藏(注意別與重載混淆)。 
(2)如果衍生類別的函數與基類的函數同名,並且參數也相同,但是基類函數沒有virtual 關鍵字。此時,基類的函數被隱藏(注意別與覆蓋混淆) 

下面參照執行個體看一下:

 1、覆蓋

    /**//*
     * 覆蓋方法的測試
  */
    public class Base_Override ...{ 
        public virtual void Introduce()...{
            System.Console.WriteLine("I'm Base_Override_Introduce()");
        }

        public virtual void SayHi() ...{
            System.Console.WriteLine("I'm Base_Override_SayHi()");
        }
    }

    public class Derive_Override:Base_Override...{
        public override void Introduce()
        ...{
            System.Console.WriteLine("I'm Derive_Override_Introduce()");
            //base.Introduce();
        }

         //注意,此方法沒有 override 父類的方法
    //編譯時間有警告,建議添加override或new
        //此方法C#中預設為隱藏,在C++這種情況應該不是隱藏 應該資料覆蓋
        public void SayHi() ...{
            System.Console.WriteLine("I'm Derive_Override_SayHi()");
        }

        public void 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、隱藏

 

    /**//*
     * 隱藏方法的測試
     */
    public class Base_New ...{
        public void Introduce()
        ...{
            System.Console.WriteLine("I'm Base_New_Introduce()");
        }

        public void SayHi()
        ...{
            System.Console.WriteLine("I'm Base_New_SayHi()");
        }
    }

    public class Derive_New : Base_New ...{
        // 沒有加new,但C#預設行為會加上new
        //編譯時間有警告,建議添加override或new
        public void Introduce()
        ...{
            System.Console.WriteLine("I'm Derive_new_Introduce()");
        }

        // 顯式加上new,跟不加new實際效果一樣,只是加new之後會消除compile warning
        public new void 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++中的用法依然存在著細微的不同。。

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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.