abstract :表示方法是抽象方法,在子類中必須重寫。抽象方法所在的類必須是抽象類,即用abstract modifiers;
virtual:表示此方法是virtual方法,除了在子類中可以重寫外(在子類中也可直接使用),和普通方法完全一樣;
override:表示重寫父類的virtual方法;
new: 顯式隱藏從基類繼承的成員;
區別:
virtual:標記方法為虛方法
1.可在派生類中以override覆蓋此方法
2.不覆蓋也可由物件呼叫
3.無此標記的方法(也無其他標記),重寫時需用new隱藏原方法
abstract 與virtual : 方法重寫時都使用 override 關鍵字
Eg1:
public abstract class Book { public Book() { } public abstract void getPrice(); //抽象方法,不含主體 public virtual void getName() //虛方法,可覆蓋 { Console.WriteLine("this is a test:virtual getName()"); } public virtual void getContent() //虛方法,可覆蓋 { Console.WriteLine("this is a test:virtual getContent()"); } public void getDate() //一般方法,若在派生類中重寫,須使用new關鍵字 { Console.WriteLine("this is a test: void getDate()"); } } public class ChineseBook : Book { public override void getPrice() //實現抽象方法,必須實現 { Console.WriteLine("this is a test:ChineseBook override abstract getPrice()"); } public override void getName() //覆蓋原方法,不是必須的 { Console.WriteLine("this is a test:ChineseBook override virtual getName()"); } public new void getDate() { Console.WriteLine("this is a test:ChineseBook new getDate()"); } public void Run() { getPrice(); getName(); getContent(); getDate(); } }
Output:
this is a test:ChineseBook override abstract getPrice()
this is a test:ChineseBook override virtual getName()
this is a test:virtual getContent()
this is a test:ChineseBook new getDate()
Eg2:
public abstract class FlowModel { public abstract void A(); public virtual void B(){ Console.WriteLine("Orginal B()"); } public virtual void C(){ Console.WriteLine("Orginal C()"); } public void D(){ Console.WriteLine("Orginal D()"); } } public class Flow:FlowModel { public override void A() { //執行步驟A Console.WriteLine("Execute Step A "); } public virtual void B() { //執行步驟B Console.WriteLine("Execute Step B"); } public void C() { //執行步驟C Console.WriteLine("Execute Step C"); } public new void D() { Console.WriteLine("Execute Step D"); } public void Run() { A(); B(); //步驟B是擴充套件點 ,可以由子類決定具體執行什麼 C(); D(); } }
Output:
Execute Step A
Execute Step B
Execute Step C
Execute Step D