<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      .net 繼承&多態情況下,調用方法的判斷規則

      從子類開始,一直向父類遞歸

      如果方法聲明在接口上,那么返回這個方法 

      如果方法聲明在父類上,如下所示

        如果給定的方法是override,那么返回虛方法 (被override的方法)

        如果給定的方法是new的 (注意,默認就是new), 那么將返回該方法本身, (在IL中可以看到newslot)

        如果該方法沒有被定義在當前類型中,那么返回開始分析當前類的父類

      以下是原文,我的翻譯有改動部分內容

      If the method is declared on an interface, returns the method.

      If the method is defined in a base class, then works as follows:

                   If a given method overrides a virtual definition in the base class, the virtual definition is returned.

                   If a given method is specified with the new keyword (as in newslot as described in Common Type System), the given method is returned.

                   If the method is not defined in the type of the object on which GetBaseDefinition is called, the method definition highest in the class hierarchy is returned.

      通過ILSpy 查看生成的IL可以證明這一點

      還是舉個詳細的例子吧

      1.子類沒有實現 繼承自父類

      namespace CSharpTester
      {
      class Program
      {
      static void Main(string[] args)
      {
      A a
      = new A();
      B b
      = new A();
      a.A1();
      b.A1();
      }
      }
      public class A : B
      {
      }
      public class B
      {
      public void A1() { Console.WriteLine(1); }
      }
      }

      結果是,注意IL指令中子類調用的是B.A1

      2.子類override父類的實現

      namespace CSharpTester
      {
      class Program
      {
      static void Main(string[] args)
      {
      A a
      = new A();
      B b
      = new A();
      a.A1();
      b.A1();
      }
      }
      public class A : B
      {
      public new void A1()
      {
      Console.WriteLine(
      2);
      }
      }
      public class B
      {
      public virtual void A1()
      {
      Console.WriteLine(
      1);
      }
      }
      }

      結果是,注意IL指令中子類調用的是A.A1

      3.子類override父類的方法

      namespace CSharpTester
      {
      class Program
      {
      static void Main(string[] args)
      {
      A a
      = new A();
      B b
      = new A();
      a.A1();
      b.A1();
      }
      }
      public class A : B
      {
      public override void A1()
      {
      Console.WriteLine(
      2);
      }
      }
      public class B
      {
      public virtual void A1()
      {
      Console.WriteLine(
      1);
      }
      }
      }

      結果是,IL中子類調用的是B.A1


      4.子類直接或者間接繼承接口 (注意調用方法還是從接口出發;如果是從類型出發,那么和上面三種情況是一致的)

      namespace CSharpTester
      {
      class Program
      {
      static void Main(string[] args)
      {
      IB a
      = new A();
      IB b
      = new A();
      A a1
      = new A();
      B b1
      = new A();

      a.A1();
      b.A1();
      a1.A1();
      b1.A1();

      }
      }
      public class A : B
      {
      public new void A1()
      {
      Console.WriteLine(
      2);
      }
      }
      public class B : IB
      {
      public virtual void A1()
      {
      Console.WriteLine(
      1);
      }
      }
      public interface IB
      {
      void A1();
      }
      }

      如果是從接口出發調用方法,IL中都是調用IB.A1 (無論其真實類型是什么); 而如果從類型出發 和1-3點是一致的



      到此為止,我們知道了不同類型聲明對應的IL指令

      在沒有override只有new的情況下,我們可以很準確的判斷出被調用的方法

      而在有override的情況下,(注 只有virtual方法才能被override)

      子類執行的IL指令是B.A1(), 那么CLR是如何讓真正被執行的方法是 A.A1() 而不是B.A1()呢

      因為CLR在執行B.A1()的時候傳入了一個參數, 就是A的實例對象a  (C#代碼 a.A1()中的a就是A的實例對象)

      現在有了對象,不過呢,方法定義在哪里?

      在。net中虛方法繼承以后的位置不改變, 例如 B.A1()的Slot位置是5, 那么其子類的方法A.A1()的Slot位置也是5

      那么結果就出來了,首先根據IL指令 B.A1()獲取Slot相對位置,然后根據實例參數a 獲取A的類型定義,同樣的 找到位置5.那就是A.A1(),這才是真正被執行的方法

      a.A1() -> IL指令為B.A1() -> 獲取slot位置 ->

                -> 獲得a -> 獲得a的類型定義A -> 獲得A同樣slot位置的方法

                ->執行方法

      順便說一句:

      IL指令callvirt 就是專門用來處理這種情況的, (callvirt會執行運行時綁定檢查實例對象,在運行時才知道真正的方法在哪里)

      對應的 還有一個IL指令call就不檢查這種情況,(你可以發現 靜態方法的生成的IL指令都是call,不需要實例對象)

      未完待續

      posted on 2011-09-20 22:22  聽說讀寫  閱讀(1321)  評論(1)    收藏  舉報

      導航

      主站蜘蛛池模板: 视频一区二区三区四区不卡| 久久精品国产一区二区三| 一区二区三区精品视频免费播放 | 亚洲一区二区美女av| 国产对白老熟女正在播放| 日本美女性亚洲精品黄色| 一区二区亚洲精品国产精| 综合色一色综合久久网| 和黑人中出一区二区三区| 欧美 亚洲 日韩 在线综合| 国产成人精品一区二区无| 欧美国产成人精品二区芒果视频| 日韩少妇人妻vs中文字幕| 伊人av超碰伊人久久久| 欧美亚洲另类制服卡通动漫| 国产美女久久久亚洲综合| 亚欧洲乱码视频一二三区| 亚洲日韩乱码一区二区三区四区 | 亚洲中文字幕久久精品码| 国产欧美日韩视频怡春院| 欧美国产亚洲日韩在线二区 | 天天澡日日澡狠狠欧美老妇| 欧美国产日产一区二区| 在线播放国产精品三级网| 久久这里都是精品二| 极品蜜桃臀一区二区av| 在线高清免费不卡全码| 国产又色又爽又黄的在线观看| 久久99久久99精品免视看国产成人| 人妻被猛烈进入中文字幕| 99久久精品久久久久久婷婷| 国产亚洲精品aaaa片app| 91色老久久精品偷偷性色| 被拉到野外强要好爽| 18禁无遮挡啪啪无码网站破解版| 国产成人av一区二区三| 国产在线精品欧美日韩电影| 日本大片在线看黄a∨免费| 临颍县| 亚洲老女人区一区二视频| 国产成人a∨激情视频厨房|