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();
}
}
}