對於Virtual的使用,有時候總有些猶豫,特別是最近學的東西太雜,今天化了點時間,把C#裡面的Virtual徹底搞明白了。
virtual出問題主要是由於聲明對象的類和對象實際所屬的類不是一個類,一般都是父類和子類的關係。比如:
ClassParent obj = new ClassSub(),這是根源。
virtual和非virtual關鍵是在運行時候,而不是在編譯時間候。
1, 如果方法不是virtual的,編譯器就使用聲明的類對應的類型,也就是說,不是virtual的,在編譯時間候,就定了。比如下面的例子:子類的方法都沒有執行,執行的全部都是父類的方法。啟動並執行結果是
father
boy
girl
using System;
public class ClassFather
{
public string s1;
// virtual public void VirFun()
public void VirFun()
{ Console.WriteLine( s1 );}
}
public class ClassBoy : ClassFather
{
public new void VirFun()
{ base.VirFun();}
}
public class ClassGirl : ClassFather
{
public new void VirFun()
{
base.VirFun();
Console.WriteLine( s1 );
}
}
public class Test
{
public static void Main()
{
ClassFather a = new ClassFather();
a.s1 = "father";
a.VirFun();
ClassFather b = new ClassBoy();
b.s1 = "boy";
b.VirFun();
ClassFather c = new ClassGirl();
c.s1 = "girl";
c.VirFun();
}
}
2, 如果方法是Virtual的,然後子類使用了override, 編譯器就生產代碼。然後,在啟動並執行時候,進行檢測,看對象屬於哪個類,然後調用這個類的方法。 這個是最常用的方法,基本上所有書上說的就是這個,我就不多此一舉了。
3,如果一個父類的方法是virtual,子類不是用override,而是用new來覆蓋了,那麼運行子類的時候,還是執行聲明的類的方法。比如下面的例子中,girl類對象就是。using System;
public class ClassFather
{
public string s1;
virtual public void VirFun()
{ Console.WriteLine( s1 );}
}
public class ClassBoy : ClassFather
{
public override void VirFun()
{ base.VirFun();}
}
public class ClassGirl : ClassFather
{
public new void VirFun()
{
base.VirFun();
Console.WriteLine( s1 );
}
}
public class Test
{
public static void Main()
{
ClassFather a = new ClassFather();
a.s1 = "father";
a.VirFun();
ClassFather b = new ClassBoy();
b.s1 = "boy";
b.VirFun();
ClassFather c = new ClassGirl();
c.s1 = "girl";
c.VirFun();
}
}