//基類中(zhōng)的虛方法到底有什麽作用?
//C#中(zhōng)指出:普通的方法重載:指的是類中(zhōng)兩個以上的方法(包括隐藏的,繼承而來的方法)取的名字相同,隻要使用的參數類型或者參數個數不同,編譯器便
//知(zhī)道在何種情況下(xià)應該調用哪個方法。
//而在派生(shēng)類中(zhōng)重新定義此虛方法時要求的是:方法名稱、返回值類型、參數表中(zhōng)的參數個數、類型、順序都必須與基類中(zhōng)的虛方法完全一(yī)緻。
//簡單一(yī)點說就是子類中(zhōng)override的方法能夠覆蓋基類中(zhōng)的virtual方法,當你把一(yī)個子類的實例轉換爲基類時,調用該方法時還是調用的子類的override的方
//法。
//一(yī)個類裏面兩個名字一(yī)樣的方法叫“重載”,基類和繼承類裏面名字一(yī)樣的方法叫“重寫”,重寫就必須使用虛方法。
//隻有基類的方法加上關鍵字virtual後才可以被派生(shēng)類override,從而實現面向對象最重要的特征--多态性,即基類可以使用派生(shēng)類的方法
//父類中(zhōng)的方法重載,提供了某行爲的不同實現方法(傳入不同的參數);
//在子類中(zhōng)對父類相應方法的重載,可以這樣理解(實際編譯過程不是這樣),子類完全copy父類代碼後,把重載(override)的那部分(fēn)代碼挖去(qù)并用子類新的
//代碼填上。
//如果子類沒有重載(沒有使用voerride關鍵字)而有和父類完全一(yī)樣的方法,可以這樣理解,子類沒有挖去(qù)代碼,隻是簡單覆蓋,當要使用集成
//來的代碼時,隻需要類型轉換就可以把覆蓋代碼浮現出來。
//如果不想讓虛方法進行重寫,可以用關鍵字(sealed)進行保護
//示例:public override sealed void Write();//sealed隻能用在重寫方法上
//下(xià)面的代碼舉例說明
class a
{
public virtual void VirtualMothed()
{
Console.WriteLine("這是a類中(zhōng)的一(yī)個虛方法");
}
public void NoVirtualMothed()
{
Console.WriteLine("這是a類中(zhōng)的一(yī)個非虛方法");
}
}
class b:a
{
public override void VirtualMothed()
{
Console.WriteLine("這是b類中(zhōng)重寫的一(yī)個虛方法");
}
public new void NoVirtualMothed()//非虛方法就不是重寫了,需要定義一(yī)個new來告訴編譯器我(wǒ)(wǒ)新定義了一(yī)個方法。
{
Console.WriteLine("這是b類中(zhōng)的一(yī)個非虛方法");
}
}
class Program
{
static void Main(string[] args)
{
//虛方法:若一(yī)個實例方法聲明中(zhōng)含有virtual這個修飾符,則稱該方法爲虛方法,否則就是非虛方法。
a a = new a();//實例化類a
a.VirtualMothed();//輸出結果:這是a類中(zhōng)的一(yī)個虛方法
a.NoVirtualMothed();//輸出結果:這是a類中(zhōng)的一(yī)個非虛方法
b b = new b();
b.VirtualMothed();//輸出結果:這是b類中(zhōng)重寫的一(yī)個虛方法
b.NoVirtualMothed();//輸出結果:這是b類中(zhōng)的一(yī)個非虛方法
a = b;//将b賦值給a
a.VirtualMothed();//輸出結果:這是b類中(zhōng)重寫的一(yī)個虛方法
a.NoVirtualMothed();//輸出結果:這是a類中(zhōng)的一(yī)個非虛方法
Console.ReadKey();
}
}