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

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

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

      C#中接口的實例化

      一、接口回調

      就是繼承中的向上轉型。父類 FL=new 子類();只不過這里的父類就是interface接口。(個人認為這里不管是class的override還是interface的重寫,都是一樣的用法)

      可以把實現某一接口類創建的對象的引用賦給該接口聲明的接口變量,那么該 接口變量就可以調用被類實現的接口中的方法。實際上,當接口變量調用被類實現的接口 

      中的方法時,就是通知相應的對象調用接口方法

       

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

      namespace InterfaceTest {
      interface IMyInterface {
      void AMethod();
      }
      class Test : IMyInterface {
      public void AMethod() {
      Console.WriteLine("Extends from IMyInterface in Test1");
      }}
      class Test2 : IMyInterface {
      public void AMethod() {
      Console.WriteLine("Extends from IMyInterface in Test2");
      }}
      class Program {
      static void Main(string[] args) {
      IMyInterface a = new Test();
      IMyInterface b=new Test2();
      a.AMethod();
      b.AMethod();
      Console.ReadKey();
      }} }

      執行結果如下: 
      Extends from IMyInterface in Test1 
      Extends from IMyInterface in Test2
      接口對象的實例化實際上是一個接口對象作為一個引用 
      ,指向實現了它方法的那個類中的所有方法,這一點非常象C++中的函數指針(在C#中類似委托),但是卻是有 
      區別的。C#中的接口對象實例化實際上是一對多的,而C++中的函數指針是一對一的。 
      但是需要注意的是,接口對象的實例化必須用實現它的類來實例化,而不能用接口本身實 
      例化。用接口本身實例化它自己的對象在C#中是不允許的。

      1.如何獲取接口interface的所有實現實例對象?

      如果我們想一次性將所有實現了某個接口的某個方法的實例全部執行一遍,只能一個對象一個對象的初始化然后調用方法,這樣太麻煩了,可以通過動態創建對象并執行對象的方法來實現這個效果

       

      通過反射來獲取當前項目中的程序集對象列表,并根據程序集對象的類型獲取繼承或實現了接口的對象列表

      //獲取實現接口IAnimal的實例對象
      var types = AppDomain.CurrentDomain.GetAssemblies()
                              .SelectMany(a => a.GetTypes().Where(t => t.GetInterfaces().Contains(typeof(IAnimal))))
                              .ToList(); 

       foreach (Type t in types)
      {
          var animal = (IAnimal)Activator.CreateInstance(t)!;
          animal.Cry();
      }

       上述方法只能用于包含無參構造函數的類,只包含有參構造函數的類會出錯

      2.如何判斷實例對象的構造函數是否有參數?

        我們可以通過GetConstructors方法來獲取對象的構造函數集合,并通過GetParameters方法獲取到構造函數的參數集合,判斷構造函數的參數集合是否為空即可判斷該對象的構造函數是否為有參或無參構造函數。

      foreach (Type v in types)
      {
          if (v.GetConstructors().Any(x => x.GetParameters().Any()))
          {
              Console.WriteLine($"{v.Name}=>有參構造函數");
          }
          else
          {
              Console.WriteLine($"{v.Name}=>無參構造函數");
          }
      }

      foreach (Type t in types)
      {
          IAnimal animal;
          if (t.GetConstructors().Any(x => x.GetParameters().Any()))
          {
              //有參構造函數
              //動態創建IAnimal的有參構造函數實現實例對象Dog
              animal = (IAnimal)Activator.CreateInstance(t, new object[] { "阿黃" })!;
          }
          else
          {
              //無參構造函數
              //動態創建IAnimal的無參構造函數實現實例對象Cat
              animal = (IAnimal)Activator.CreateInstance(t, new object[] { })!;
          }
          animal.Cry();



      posted @ 2023-08-30 09:08  暗黑銀狐  閱讀(446)  評論(0)    收藏  舉報
      主站蜘蛛池模板: japanese无码中文字幕| 国产在线精品福利91香蕉| 中文无码乱人伦中文视频在线| 亚洲精品久久久久久无码色欲四季| 久久天堂无码av网站| 久热综合在线亚洲精品| 在线天堂中文www官网| 伊人久久大香线蕉av色婷婷色| 亚洲av无码专区在线亚| 韩国无码AV片午夜福利| 妇女性内射冈站hdwww000| 综合色天天久久| 人妻少妇精品视频二区| 又大又粗欧美成人网站| 安西县| 国产精品爽爽久久久久久竹菊| 日韩无人区码卡1卡2卡| 野外做受三级视频| 邹城市| 国产精品色内内在线播放| 无码高潮爽到爆的喷水视频app| 狠狠色狠狠综合久久| 亚洲中文久久久精品无码| 大尺度国产一区二区视频| 亚洲欧洲精品一区二区| 99国产欧美另类久久久精品| 99久久亚洲综合精品成人网 | 在线观看中文字幕国产码 | 蜜芽久久人人超碰爱香蕉| 国产成人久久精品二区三| 最新成免费人久久精品| 欧美牲交a欧美牲交aⅴ一| 国产亚洲精品久久久久婷婷图片 | 白白色发布永久免费观看视频| 建德市| 精品午夜福利短视频一区| 婷婷久久香蕉五月综合加勒比 | 欧美人成精品网站播放| 国产农村老熟女国产老熟女| 国产精品无码av不卡| 内射极品少妇xxxxxhd|