Virtual方法(虛方法)
virtual 關鍵字用於在基類中修飾方法。virtual的使用會有兩種情況:
情況1:在基類中定義了virtual方法,但在派生類中沒有重寫該虛方法。那麼在對派生類實例的調用中,該虛方法使用的是基類定義的方法。
情況2:在基類中定義了virtual方法,然後在派生類中使用override重寫該方法。那麼在對派生類實例的調用中,該虛方法使用的是派生重寫的方法。
代碼如下:
namespace VirtualTestApplication
{
public class A
{
public virtual string print()
{
return "我是A類";
}
}
public class B : A
{
}
public class C : A
{
public override string print()
{
return "我是C類";
}
}
}
再在主程序入口調用方法:
static void Main(string[] args)
{
B b = new B();
C c = new C();
Console.WriteLine(b.print());
Console.WriteLine(c.print());
Console.ReadKey();
}
運行結果:
virtual和abstract的異同點:
virtual和abstract都是用來修飾父類的,通過覆蓋父類的定義,讓子類重新定義。
它們有一個共同點:如果用來修飾方法,前面必須添加public,要不然就會出現編譯錯誤:虛擬方法或抽象方法是不能私有的。畢竟加上virtual或abstract就是讓子類重新定義的,而private成員是不能被子類訪問的。
不同點:
1、virtual修飾的方法必須有實現(哪怕是僅僅添加一對大括號),而abstract修飾的方法一定不能實現。如對於virtual修飾的方法如果沒有實現:
public class Test1
{
public virtual void fun1();
}
錯誤 : “Test1.fun1()”必須聲明主體,因爲它未標記爲 abstract、extern 或 partial
對於abstract修飾的方法如果有實現:
public abstract class Test2
{
public abstract void fun2() { }
}
錯誤 : “Test2.fun2()”無法聲明主體,因爲它標記爲 abstract
2、virtual可以被子類重寫,而abstract必須被子類重寫,
class BaseTest1
{
public virtual void fun() { } // 必須有實現
}
class DeriveTest1:BaseTest1
{
//public override void fun() { }
}
編譯不會出現錯誤,如果重寫了virtual修飾的方法,前面必須添加override(這樣就告訴了編譯器你要重寫虛擬方法),而且必須有實現,否則編譯出錯;
abstract class BaseTest2
{
public abstract void fun();
}
class DeriveTest2 : BaseTest2
{
//public override void fun();錯誤1:沒有實現
//public void fun() { } 錯誤2:重寫時沒有添加override
//override void fun() { }錯誤3:虛擬成員或者抽象成員不能是私有的(只要在父類中聲明瞭虛擬成員或抽象成員,即便是繼承的也要加上這個限制)
public override void fun() { }//正確重寫抽象方法;
}
3、如果類成員被abstract修飾,則該類前必須添加abstract,因爲只有抽象類纔可以有抽象方法。
4、無法創建abstract類的實例,只能被繼承無法實例化,比如:BaseTest2 base2 = new BaseTest2();將出現編譯錯誤:抽象類或接口不能創建實例。
5、C#中如果要在子類中重寫方法,必須在父類方法前加virtual,在子類方法前添加override,這樣就避免了程序員在子類中不小心重寫了父類方法。