C#中的abstract與virtual

來源:互聯網
上載者:User
C#中的abstract與virtual2008-03-14 14:01

【abstract】
abstract 修飾符可以和類、方法、屬性、索引器及事件一起使用。
在類聲明中使用 abstract 修飾符以指示類只能是其他類的基類。

抽象類別具有以下特性:
·抽象類別不能執行個體化。
·抽象類別可以包含抽象方法和抽象訪問器。
·不能用 sealed 修飾符修改抽象類別,這意味著該類不能被繼承。
·從抽象類別派生的非抽象類別必須包括繼承的所有抽象方法和抽象訪問器的實實現。
·在方法或屬性聲明中使用 abstract 修飾符以指示此方法或屬性不包含實現。

抽象方法具有以下特性:
·抽象方法是隱式的 virtual 方法。
·只允許在抽象類別中使用抽象方法聲明。
·因為抽象方法聲明不提供實實現,所以沒有方法體;方法聲明只是以一個分號結束,並且在簽名後沒有大括弧 ({ })。例如: public abstract void MyMethod();
·實現由 overriding 方法提供,它是非抽象類別的成員。
·在抽象方法聲明中使用 static 或 virtual 修飾符是錯誤的。

除了在聲明和調用文法上不同外,抽象屬性的行為與抽象方法一樣。
·在靜態屬性上使用 abstract 修飾符是錯誤的。
·在衍生類別中,通過包括使用 override 修飾符的屬性聲明可以重寫抽象的繼承屬性。

【virtual】
virtual 關鍵字用於修改方法或屬性的聲明,在這種情況下,方法或屬性被稱作虛擬成員。虛擬成員的實現可由衍生類別中的重寫成員更改。

調用虛方法時,將為重寫成員檢查該對象的運行時類型。將調用大部指派生類中的該重寫成員,如果沒有衍生類別重寫該成員,則它可能是原始成員。

預設情況下,方法是非虛擬。不能重寫非虛方法。

不能將 virtual 修飾符與以下修飾符一起使用:
static   abstract   override

除了聲明和調用文法不同外,虛擬屬性的行為與抽象方法一樣。
·在靜態屬性上使用 virtual 修飾符是錯誤的。
·通過包括使用 override 修飾符的屬性聲明,可在衍生類別中重寫虛擬繼承屬性。

【override】 (覆蓋上面兩種關鍵字修飾方法)
使用 override 修飾符來修改方法、屬性、索引器或事件。重寫方法提供從基類繼承的成員的新實現。由重寫聲明重寫的方法稱為重寫基方法。重寫基方法必須與重寫方法具有相同的簽名。

不能重寫非虛方法或靜態方法。重寫基方法必須是虛擬、抽象的或重寫的。
重寫聲明不能更改虛方法的可訪問性。重寫方法和虛方法必須具有相同的訪問級修飾符。
不能使用下列修飾符修改重寫方法:
new   static    virtual   abstract
重寫屬性聲明必須指定與繼承屬性完全相同的存取修飾詞、類型和名稱,並且重寫屬性必須是虛擬、抽象的或重寫的。
using System;

namespace VitualMethod
{
    class BeiseClass
    {
        public void RealMethod()
        {
            Console.WriteLine(@"The ""RealMethod"" method of ""BeiseClass"" class!");
        }

        public virtual void ViutualMethod()
        {
            Console.WriteLine(@"The ""ViutualMethod"" method of ""BeiseClass""class!");
        }
    }

    class NewAndOverride: BeiseClass
    {
        /// <summary>
        /// “new”用於隱藏基類成員的繼承成員,是重寫方法的另一種辦法;
        /// 在同一成員上同時使用 new 和 override 是錯誤的;
        /// “override”是覆蓋了虛擬方法。
        /// </summary>
        new public void RealMethod()
        {
            Console.WriteLine(@"The ""RealMethod"" method of ""NewAndOverride"" class!");
        }

        public override void ViutualMethod()
        {
            Console.WriteLine(@"The ""ViutualMethod"" method of ""NewAndOverride""class!");
        }
    }

    class Tester
    {
        /// <summary>
        /// 運行結果:
        /// The "RealMethod" method of "BeiseClass" class!
        /// The "RealMethod" method of "NewAndOverride" class!
        /// The "ViutualMethod" method of "BeiseClass"class!
        /// The "ViutualMethod" method of "NewAndOverride"class!
        ///
        /// The "RealMethod" method of "BeiseClass" class!
        /// The "ViutualMethod" method of "NewAndOverride"class!
        /// </summary>
        static void Main()
        {
            BeiseClass beiseClass = new BeiseClass();
            NewAndOverride newAndOverride = new NewAndOverride();
       
            beiseClass.RealMethod();
            newAndOverride.RealMethod();
       

            beiseClass.ViutualMethod();
            newAndOverride.ViutualMethod();

            Console.WriteLine();

           //
            // 注意:可以看到隱藏(new)方法仍然存在,而被覆蓋(override)的方法已經不存在了;
            //
            beiseClass = newAndOverride;
           
            beiseClass.RealMethod();
            beiseClass.ViutualMethod();

        }
    }
}

【new】
使用 new 修飾符顯式隱藏從基類繼承的成員。若要隱藏繼承的成員,請使用相同名稱在衍生類別中聲明該成員,並用 new 修飾符修飾它。

類 成員聲明中可以使用與一個被繼承的成員相同的名稱或簽名來聲明一個成員。發生這種情況時,就稱該衍生類別成員隱藏了基類成員。隱藏一個繼承的成員不算是錯 誤,但這確實會導致編譯器發出警告。若要取消此警告,衍生類別成員的聲明中可以包含一個 new 修飾符,表示派產生員是有意隱藏基成員的。

using System;

namespace TheNewKeyword
{

    class NewTestClassBase
    {
        public void PrintNewKeyword()
        {
            Console.WriteLine(@"This is base class!");
        }
    }

    class NewTestClass : NewTestClassBase
    {
        //// <summary>
        /// 如果這樣寫:
        /// override public void PrintNewKeyword()
        ///
        /// 將產生編譯錯誤:
        /// “TheNewKeyword.NewTestClass.PrintNewKeyword()” :
        /// 無法重寫繼承成員“TheNewKeyword.NewTestClassBase.PrintNewKeyword()”,
        /// 因為它未標記為 virtual、abstract 或 override。
        /// </summary>
        new public void PrintNewKeyword()
        {
            Console.WriteLine(@"This is ""new"" keyword!");
        }
    }

   
   //// <summary>
    /// TheNewKeyword 測試“new”關鍵字。
    /// </summary>
    class TheNewKeyword
    {
        //// <summary>
        /// 運行結果:
        /// This is base class!
        /// This is "new" keyword!
        /// </summary
        static void Main()
        {
            //
            // TODO: 在此處添加代碼以啟動應用程式
            //
            NewTestClassBase newTestClassBase = new NewTestClassBase();
            NewTestClass newTestClass = new NewTestClass();

            newTestClassBase.PrintNewKeyword();
            newTestClass.PrintNewKeyword();
        }
    }
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.