virtual/abstract 和 override/new/sealed

virtual 表示父類中方法可被重寫(父類中未聲明爲virtual的即不可被重寫);

abstract 表示方法爲抽象類,聲明時不含方法體,且所在類也需變爲抽象類;

override 表示子類中重寫的方法(父類中被繼承的方法應該是virtual或abstract)

new 表示覆蓋父類中的方法,不管該方法是否是可重寫的,均可覆蓋

sealed 表示密封/保護子類中繼承父類的方法,非繼承方法不可用sealed

示例如下(C#):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Test
{
    /*
	* ==============================================================================
	* Filename: Father
	* Description: Class Father provide a class describing...
	*
	* Version: 1.0
	* Created: 2019/3/1 15:54:56
	* Compiler: Visual Studio 2017
	*
	* Author: XXX
	* Company: XXX
	* ==============================================================================
	*/
    abstract class Father
    {
        public string SayHello()
        {
            return "Hello !";
        }

        public string SayGood()
        {
            return "Good ! ";
        }

        //父類中聲明該方法是允許重寫的方法(virtual)
        public virtual string SayNo()
        {
            return "No ! ";
        }

        //必須在子類中重寫
        public abstract string SayYes();
    }

    class ChildA : Father
    {
        //除父類中virtual和abstract修飾的方法外,均不可被重寫
        //override:重寫父類方法,必須/最好 顯示重寫
        public override string SayNo()
        {
            return base.SayNo() + this.GetType().Name + "!";
        }
        //new:即使聲明爲virtual的父類方法,也可被覆蓋
        //public new string SayNo()
        //{
        //    return base.SayNo() + this.GetType().Name + "!";
        //}

        //override:抽象類重寫:必須要重新父類抽象類,必須要有關鍵字override
        //sealed: 密封被重寫override的方法,即該方法所在類的派生類不可被重載
        public override sealed string SayYes()
        {
            return "Yes !" + this.GetType().Name + "!";
        }
        //new:抽象類也可直接被覆蓋
        //public new string SayYes()
        //{
        //    return "Yes !" + this.GetType().Name + "!";
        //}

        //new:對於父類中不可重寫的類,可用new覆蓋
        public new string SayGood()
        {
            return base.SayGood() + this.GetType().Name + "!";
        }
    }

    class ChildB : ChildA
    {
        //override:只可重寫SayNo,因爲SayYes被sealed(當SayYes未被sealed時可被重寫)
        public override string SayNo()
        {
            return base.SayNo();
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章