1. 程式人生 > >ASP.NET之虛方法

ASP.NET之虛方法

判斷 關鍵字 就是 str 繼承 它的 read lec 實現

1.虛方法關鍵字?

Virtual

2.虛方法運行的周期?

虛函數在編譯期間是不被靜態編譯的,它的相對地址是不確定的,它會根據運行時對象實例來動態判斷要調用的函數,其中那個申明時定義的類叫申明類,執行實例化的那個類叫做實例類。

3.函數運行的檢查流程:

1當調用一個對象的函數時,系統會直接去檢查這個對象的申明定義的類(申明類),檢查調用的函數是否為虛函數,如果不是虛函數,那麽它就執行該函數。而如果有Viirtual關鍵字(虛函數),那麽它

就不會立即執行該函數。而是轉去檢查對象的實例類。在這個實例類裏,它會檢查這個實例類中是否有重現實現該函數(Override),如果有就不再找了,馬上執行該實例類中的這個重新實現的函數

而如果每天有,系統就會不停的往上找實例類,直到找到第一個重載了該函數的父類為止,然後執行父類裏重載後的的函數

另註意:虛函數裏必須有方法體。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleHelp
{
  public  class RunVirtual
    {

      /// <summary>
      /// 虛方法說明以及代碼
      /// </summary>
public void TestRunVirtual() { //註意:虛方法不允許static, abstract, 或override 修飾符 TestA A;// 定義一個a這個A類的對象.這個A就是a的申明類 TestA B;// 定義一個b這個A類的對象.這個A就是b的申明類 TestA C;// 定義一個c這個A類的對象.這個A就是b的申明類 TestA D;// 定義一個d這個A類的對象.這個A就是b的申明類 A = new TestA();// 實例化a對象,A是a的實例類
B = new TestB();// 實例化b對象,B是b的實例類 C = new TestC();// 實例化b對象,C是b的實例類 D = new TestD();// 實例化b對象,D是b的實例類 A.Fuctio();//先檢查聲明類A,發現是虛函數,跳出檢查實例類即為本身,執行A的Fuctio方法 B.Fuctio();//先檢查聲明類A,發現是虛函數,跳出檢查實例類,實例類B中有重寫,執行重寫方法Fuctio C.Fuctio();//先檢查聲明類A,發現是虛函數,跳出檢查實例類,實例類C中沒有重寫,找父類B(繼承了B類),執行B類中重寫方法Fuctio D.Fuctio();//先檢查聲明類A,發現是虛函數,跳出檢查實例類,實例類D中雖然有聲明了Fuctio方法,但並沒有重寫Fuction,找父類A,發現為本身,執行A類的Fuctio } } }

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleHelp
{
  public  class TestA
    {

      public virtual void Fuctio() {

          Console.Write("Fuction in A");
      }  

    
    }

  public  class TestB:TestA {

      public override void Fuctio()
      {
          Console.Write("Fuction in B");
      }
  }


  public class TestC : TestB {

  }


  public class TestD : TestA {

      public void Fuctio() {

          Console.Write("Fuction in D");
      }
  }
}

 

ASP.NET之虛方法