C# [method Modifiers] abstract virtual override new

滄海一滴發表於2013-10-14

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

 

 

相關文章