首先在C#中虛方法的定義:
public virtual void VirtualMethod(){......};
只要在方法名前加上virtual,就聲明了該方法為虛方法,注意聲明為虛方法後再不能加上abstract,static關鍵字聲明
以下是插入一個執行個體來說明虛方法與非虛方法的不同
public class A
{
public virtual void VirMethod()
{
Console.WriteLine("Virtual Method A");
}
public void NormalMethod()
{
Console.WriteLine("Normal Method A");
}
}
public class B : A
{
public override void VirMethod()
{
Console.WriteLine("Virtual Method B");
}
public new void NormalMethod()
{
Console.WriteLine("Normal Method B");
}
}
在main函數中執行:
B b = new B();
A a = b;//將衍生類別的執行個體賦給基類的對象
a.VirMethod();
a.NormalMethod();
b.VirMethod();
b.NormalMethod();
Console.ReadKey();
執行結果:Virtual Method B
Normal Method A
Virtual Method B
Normal Method B
通過結果表示 a.VirMethod() 虛方法是執行了B類的重寫的方法;
a.NormalMethod();非虛方法還是執行了A類本身的方法;
A a = b 這步操作是通過衍生類別的執行個體來構造基類的對象,基類指標實際上是指向衍生類別的對象;所以a.VirMethod()這一步調用的是衍生類別重寫了的方法。
而a.NormalMethod() 還是調用基類的方法
(在這裡插下:override是重寫了基類的虛方法,new 是新建立一個方法,就是與基類同名而已,但還是子類的自已的方法)
override是重載(有的翻譯為覆蓋),new是隱藏。
再補充一下:A a = b; 其中A是聲明類,B是執行個體類
在調用函數的時候,系統是先去看聲明類,如果函數不是虛函數,就直接調用聲明類的,如果是虛函數,它會轉去檢查對象的執行個體類.(個人覺得挺有道理的)
如果繼承是物件導向設計理論的基石,那麼抽象理論和方法就是繼承理論的頂樑柱。在漢語詞典中抽象是這樣解釋的:將幾個有區別的物體的共同特性或形象抽取出來或孤立地進行考慮的行動或過程。可以看出,抽象就是從事物中提取特徵和性質,並不是事物本身。具體應該如何理解呢?
大家都知道,學生有一個共同的特徵是必須學習,那麼學什麼,如何學,每一個學生就不一樣了。這樣可以提取學習這個動作為抽象方法,而不考慮具體內容。動物類都有叫的動作,具體動物如何叫,暫不考慮,先把共性提取出來。簡單地說,用來描述這些共性的類就是抽象類別,抽象類別中不考慮具體實現,只確定必須具有的行為,就是抽象方法。
抽象方法是一個沒有實現的方法,使用關鍵字abstract定義抽象方法。文法如下:
<存取修飾詞> abstract 傳回型別 方法();
例如:
public abstract void Cry();
當一個執行個體方法聲明中含有abstract修飾符時,稱之為抽象方法(abstract methods)。抽象方法只允許在抽象類別中聲明,但是並不能實現,抽象方法聲明中只包含方法的簽名,抽象方法在其衍生類別中使用override關鍵字來重寫。在抽象方法聲明中,不允許出現static、virtual或override中的任一修飾符。
注意:和普通方法不同,抽象方法沒有閉合大括弧,在方法括弧後面直接加“;”號,表明抽象方法中沒有方法體,即沒有具體的實現。