C# new,Virtual,abstract,sealed,Override的簡單理解

來源:互聯網
上載者:User

    new

    new 關鍵字可以顯式隱藏從基類繼承的成員。隱藏繼承的成員意味著該成員的派生版本將替換基類版本。也就說在使用衍生類別的方法是調用的方法是New關鍵字新定義出來的方法,而不是基類的方法。
   在不使用
new 修飾符的情況下隱藏成員是允許的,但會產生警告。使用 new 顯式隱藏成員會取消此警告,並記錄代之以派生版本這一事實。

    Virtual

    Virtual 關鍵字允許在衍生類別中重寫這些對象,預設情況下,方法是非虛擬,不可以重寫非虛方法,virtual關鍵字不可以與static、abstract、private、override一起使用。
    Virtual關鍵字又是和override緊密不可分的,如果要實現Virtual方法就必須要使用override或new關鍵字(new和override產生的機理不同)。

    abstract

        在類聲明中使用abstract修飾符以指示某個類只能是其他類的基類。標記為抽象或包含在抽象類別中的成員必須通過從抽象類別派生的類來實現。抽象類別不能執行個體化。
        抽象方法聲明不提供實際的實現,所以沒有方法體;方法聲明只是以一個分號結束,並且在簽名後沒有大括弧 ({ })。

        sealed

        密封方法會重寫基類中的方法,但其本身不能在任何衍生類別中進一步重寫。密封類不能被繼承。
        當應用於方法或屬性時,sealed修飾符必須始終與override一起使用。

    Override

    Override關鍵字主要是提供衍生類別對基類方法的新實現,重寫的基類方法必須和Override的方法具有相同的簽名

        下邊用例字作簡單說明,例字比較繁瑣,僅作為參考!
        例子的主要想法過程為:

               基類A
                B:A
abstract C:B
sealed   D:C

       類中包含的方法想法過程為:
                     方法  A
                     new   A
                  virtual   A
               abstract  A
               override  A
  sealed override   A

 class Program
    {
        /// <summary>
        /// 定義一個基類"MyBaseClass"
        /// </summary>
        public class MyBaseClass
        {
            /// <summary>
            /// 定義一個方法
            /// </summary>
            public void DoA()
            {
                Console.WriteLine("MyBaseClass . Base DoA()");
            }
        }

        /// <summary>
        /// 定義個繼存類MyInheritClass繼承MyBaseClass類
        /// </summary>
        public class MyInheritClass : MyBaseClass
        {

            /// <summary>
            /// 此地方表示隱藏基類MyBaseClass中的DoA方法,並重寫方法
            /// </summary>
            new public void DoA()
            {
                Console.WriteLine("MyBaseClass . Inherit Base DoA()");

                //運行基類MyBaseClass的DoA方法
                base.DoA();
            }
           
            /// <summary>
            /// 定義一個虛方法
            /// </summary>
            public virtual  void DoB()
            {
                Console.WriteLine("MyBaseClass . Inherit Base DoB()");
            }
         }

        /// <summary>
         /// 定義抽象類MyAbstractClass繼承類MyInheritClass
        /// </summary>
        ///  abstract
        public abstract class MyAbstractClass : MyInheritClass
        {
            /// <summary>
            /// 隱MyInheritClass類的方法,重新定義抽象方法
            /// </summary>
            new  public abstract void DoA();
            /// <summary>
            /// 重寫基類MyInheritClass方法,此方法為新的方法
            /// </summary>
            public override void DoB()
            {
                Console.WriteLine("MyBaseClass . abstract  override DoB() ");

                //此時將調用MyInheritClass類中的方法
                base.DoA();
            }
        }

        /// <summary>
        /// 定議密封類MySealedClass繼承抽像類MyAbstractClass
        /// </summary>
        public sealed class MySealedClass : MyAbstractClass
        {
            /// <summary>
            /// 重寫基類MyAbstractClass的抽象方法
            /// </summary>
            public override void DoA()
            {
                Console.WriteLine("MyBaseClass . sealed  DoA() ");               
            }
           
            /// <summary>
            /// 密封重寫MyAbstractClass方法
            /// </summary>
            public sealed override void DoB()
            {
                Console.WriteLine("MyBaseClass . sealed  override DoB() "); 
            }

            public void CallBase()
            {
                //此時不是調用基類MyBaseClass(抽象類)的方法是調用MyAbstractClass類的方法
                base.DoB();
                //此處報錯。因為繼承抽象的方法無法調用原始方法
                //base.DoA();
            }
        }


        static void Main(string[] args)
        {
            //實例化基類並調用基類方法
            MyBaseClass BaseClasee = new MyBaseClass();
            BaseClasee.DoA();

            //實例化繼承類,並調用繼承類方法
            MyInheritClass InheritCalss = new MyInheritClass();
            InheritCalss.DoA();
            InheritCalss.DoB();

            //實例化密封類,並調用方法
            MySealedClass SealedClass = new MySealedClass();
            SealedClass.DoA();
            SealedClass.DoB();
            SealedClass.CallBase();
            Console.ReadKey();
        }

    }

        /*
         * 輸出結果
         * MyBaseClass . Base DoA()
         * 
         * MyBaseClass . Inherit Base DoA()
         * MyBaseClass . Base DoA()
         * MyBaseClass . Inherit Base DoB()         
         *  
         * MyBaseClass . sealed  DoA()  
         * MyBaseClass . sealed  override DoB() 
         * 
         *MyBaseClass . abstract  override DoB()
         *MyBaseClass . Inherit Base DoA()
         * MyBaseClass . Base DoA()
        */

相關文章

聯繫我們

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