C#中virtual(虛方法)的理解以及和abstract(抽象方法)的區別

Virtual方法(虛方法)

     virtual 關鍵字用於在基類中修飾方法。virtual的使用會有兩種情況:

     情況1:在基類中定義了virtual方法,但在派生類中沒有重寫該虛方法。那麼在對派生類實例的調用中,該虛方法使用的是基類定義的方法。

     情況2:在基類中定義了virtual方法,然後在派生類中使用override重寫該方法。那麼在對派生類實例的調用中,該虛方法使用的是派生重寫的方法。

代碼如下:

namespace VirtualTestApplication
{
 public class A
 {
     public virtual string print()
     {
         return "我是A類";
     }
  }

  public class B : A
  {

  }

  public class C : A
  {
    public override string print()
    {
      return "我是C類";
    }
  }
}

再在主程序入口調用方法:

static void Main(string[] args)
 {
       B b = new B();
       C c = new C();
       Console.WriteLine(b.print());
       Console.WriteLine(c.print());
       Console.ReadKey();
 }

運行結果:

virtual和abstract的異同點:

virtual和abstract都是用來修飾父類的,通過覆蓋父類的定義,讓子類重新定義。

它們有一個共同點:如果用來修飾方法,前面必須添加public,要不然就會出現編譯錯誤:虛擬方法或抽象方法是不能私有的。畢竟加上virtual或abstract就是讓子類重新定義的,而private成員是不能被子類訪問的。

不同點:

1、virtual修飾的方法必須有實現(哪怕是僅僅添加一對大括號),而abstract修飾的方法一定不能實現。如對於virtual修飾的方法如果沒有實現:

public class Test1
{
    public virtual void fun1();
}

錯誤 : “Test1.fun1()”必須聲明主體,因爲它未標記爲 abstract、extern 或 partial   

對於abstract修飾的方法如果有實現:

public abstract class Test2
{
    public abstract void fun2() { }
}

錯誤 : “Test2.fun2()”無法聲明主體,因爲它標記爲 abstract 

 

2、virtual可以被子類重寫,而abstract必須被子類重寫,

class BaseTest1
{
    public virtual void fun() { }    // 必須有實現
}

class DeriveTest1:BaseTest1
{
    //public override void fun() { }
}

編譯不會出現錯誤,如果重寫了virtual修飾的方法,前面必須添加override(這樣就告訴了編譯器你要重寫虛擬方法),而且必須有實現,否則編譯出錯;

abstract class BaseTest2
{
    public abstract void fun();
}

class DeriveTest2 : BaseTest2
{
    //public override void fun();錯誤1:沒有實現
    //public  void fun() { }  錯誤2:重寫時沒有添加override
    //override void fun() { }錯誤3:虛擬成員或者抽象成員不能是私有的(只要在父類中聲明瞭虛擬成員或抽象成員,即便是繼承的也要加上這個限制)
    public override void fun() { }//正確重寫抽象方法;   
}

3、如果類成員被abstract修飾,則該類前必須添加abstract,因爲只有抽象類纔可以有抽象方法。

4、無法創建abstract類的實例,只能被繼承無法實例化,比如:BaseTest2 base2 = new BaseTest2();將出現編譯錯誤:抽象類或接口不能創建實例。

5、C#中如果要在子類中重寫方法,必須在父類方法前加virtual,在子類方法前添加override,這樣就避免了程序員在子類中不小心重寫了父類方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章