天天看點

【轉】Virtual 與 abstract 差別之我見

1.abstract方法隻能在抽象類中聲明,虛方法則不是。

   abstract方法必須在派生類中重寫,而virtual則不必

2.abstract方法不能聲明方法實體,

      abstract public void SD();

   虛方法則可以

      public virtual void sdf()

        {

            Console.WriteLine("A");

        }

3.虛方法可以實作多态,而抽象方法不可以。。。

================================================================

c#中的interface abstract 與 virtual

interface用來聲明接口

1.隻提供一些方法規約,不提供方法主體. 如:

public interface IPerson

{

    void getName();//不包含方法主體

}

2.方法不能用public abstract等修飾,無字段變量,無構造函數。

3.方法可包含參數。 如

    void getAge(string s);

一個例子(例1):

   IPerson();              //錯誤

   string name;            //錯誤

   public void getIDcard();//錯誤

   void getName();         //right

   void getAge(string s); //right

實作interface的類

1.與繼承類的格式一緻,如 public class Chinese:IPerson{}

2.必須實作 interface 中的各個方法

   例2,繼承例1

public class Chinese:IPerson

   public Chinese(){}                  //添加構造

   public void getName(){}          //實作getName()

   public void getAge(string s){} //實作getAge()

abstract聲明抽象類、抽象方法

1.抽象方法所在類必須為抽象類

2.抽象類不能直接執行個體化,必須由其派生類實作。

3.抽象方法不包含方法主體,必須由派生類以override方式實作此方法,這點跟interface中的方法類似

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 JavaBook:Book

      public override void getPrice()   //實作抽象方法,必須實作

      {

           Console.WriteLine("this is a test:JavaBook override abstract getPrice()");

      }

      public override void getName()   //覆寫原方法,不是必須的

           Console.WriteLine("this is a test:JavaBook override virtual getName()");

測試如下:

public class test

   public test()

   {

    JavaBook jbook=new JavaBook();

         jbook.getPrice();      //将調用JavaBook中getPrice()

         jbook.getName();       //将調用JavaBook中getName()

         jbook.getContent();    //将調用Book中getContent()

         jbook.getDate();       //将調用Book中getDate()

    }

   public static void Main()

       test t=new test();

virtual标記方法為虛方法

1.可在派生類中以override覆寫此方法

2.不覆寫也可由對象調用

3.無此标記的方法(也無其他标記),重寫時需用new隐藏原方法

abstract 與virtual : 方法重寫時都使用 override 關鍵字