介面、索引器、Foreach的本質(學習筆記)

来源:http://www.cnblogs.com/wangzheand/archive/2016/04/12/5384648.html
-Advertisement-
Play Games

介面 什麼是介面? 介面代表一種能力,和抽象類類似但比抽象類的抽象程度更高! 介面的定義: 1 public interface IEat//定義一個介面 2 { 3 void Eat(string food);//為該介面定義一種能力 4 } 從上邊的例子中我們可以看到,介面中的方法是沒有方法體的 ...


介面

什麼是介面?

      介面代表一種能力,和抽象類類似但比抽象類的抽象程度更高!

介面的定義:

  1 public interface IEat//定義一個介面
  2  {
  3    void Eat(string food);//為該介面定義一種能力
  4   }
介面的定義

       從上邊的例子中我們可以看到,介面中的方法是沒有方法體的甚至連訪問修飾符都沒。而且在介面中只能有方法、屬性、索引器及事件!

 

介面的使用:

  1 
public class
 Dog:IEat //Dog類實現IEat介面
  2 {
  3    //Dog類實現IEat介面的Eat方法
  4    public void Eat(string food)
  5    {
  6         Console.WriteLine(""+food);
  7    }
  8 }
介面的使用

         註意:如果一個類實現了一個介面則該類必須實現該介面及其父介面的所用方法除非該類是一個抽象類則交由該類的子類來實現!一個介面也可以繼承另一個介面而不實現該介面的方法而是交由其實現者來實現

Demo:

  1 //介面一
  2 public Interface IEat
  3 {
  4     void Eat();
  5 }
  6 //介面二
  7 public Interface Ipaly
  8 {
  9     void Play();
 10 }
 11 //介面三
 12 public Interface Itravel:IEat,Ipaly
 13 {
 14       //介面三繼承介面一和介面二
 15 }
 16 
 17 public class program:Itravel
 18 {
 19    public void Eat()
 20    {
 21       //省略方法體
 22    }
 23    public void Play()
 24       {
 25             //省略方法體
 26        }
 27 }
Mode

從上面的demo中一些可以看到Itravel介面繼承的IEat介面和Ipaly介面可能有些朋友要問了”在C#以及JAVA中不是不支持多繼承嗎?”

註意這句活是針對類而言的,但針對介面來說一個類是可以實現多個介面的同樣一個介面也可以繼承多個介面

介面和抽象類的區別:

當需要的各個對象之間存在父子類關係時,可以考慮使用抽象類,

當各個對象之間不存在繼承關係,只是有相同的能力時,而已考慮使用介面

抽象類是某一類事物的抽象結果而介面則代表某些事物的一種能力

介面的註意點:

01.介面就是為了約束方法的格式(參數和返回值類型)而存在的

02.介面可以實現多繼承,彌補單繼承的缺陷。

03.介面可以看成是一個特殊的抽象類,通過反編譯看源碼可知

04.介面中方法不用訪問修飾符,因為CLR會自動添加,並且不能有方法體

05.如果一個類實現了某個介面,就得實現該介面中所有的方法

06.介面要謹慎使用,防止出現介面污染!

07.介面僅僅代表一種能力,實現該介面的類和介面沒有繼承關係

08.介面是用來實現的,類是用來繼承的。

09.其實很多時候,看似可以不用介面,因為介面就是一個方法的約定,

10.抽象類也可以實現介面,但介面成員必須映射到抽象類的抽象成員。抽象類的派生類如果是非抽象類,則必須通過方法重載來實現介面成員

索引器

為什麼要使用索引器?

解析:當一個類中包含數組或集合成員時使用索引器可以大大簡化度數組或集合成員的存取操作。

索引器的定義

  索引器的定義和屬性類似

  1  /*[修飾符] 數據類型 this[索引類型 index]
  2   {
  3     get{//獲得屬性的代碼}
  4     set{ //設置屬性的代碼}
  5   }
  6 */
索引器的定義語法

demo:

  1 
  2    public  class Students
  3     {
  4        string[] names = new string[3];
  5        public string this[int index] {
  6            get{return names[index];}
  7            set{names[index]=value;}
  8        }
  9        int[] age = new int[3];
 10        public int this[string Key]
 11        {
 12 
 13            get {
 14                for (int i = 0; i < names.Length;i++ )
 15                {
 16                    if (Key.Equals(names[i]))
 17                    {
 18                        return age[i];
 19                    }
 20                }
 21                return -1;
 22 
 23            }
 24            set
 25            {
 26                for (int i = 0; i < names.Length; i++)
 27                {
 28                    if (Key.Equals(names[i]))
 29                    {
 30                         age[i]=value;
 31                    }
 32                }
 33               ;
 34            }
 35        }
 36     }
demo

Foreach的本質:

為什麼數組和集合可以用Foreach遍歷?

解析:因為數組和集合都實現了IEnumerable介面,該介面只有一個方法GetEnumerator()所以只要實現了IEnumerable介面的類都可以被Foreach遍歷

  1  // 摘要:
  2     //     公開枚舉數,該枚舉數支持在非泛型集合上進行簡單迭代。
  3     [ComVisible(true)]
  4     [Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")]
  5     public interface IEnumerable
  6     {
  7         // 摘要:
  8         //     返回一個迴圈訪問集合的枚舉數。
  9         //
 10         // 返回結果:
 11         //     一個可用於迴圈訪問集合的 System.Collections.IEnumerator 對象。
 12         [DispId(-4)]
 13         IEnumerator GetEnumerator();
 14     }
IEnumerable原型

從上面代碼中我們可以看到IEnumerable介面的GetEnumerator()方法返回一個實現了IEnumerator介面的對象!

  1     // 摘要:
  2     //     支持對非泛型集合的簡單迭代。
  3     [ComVisible(true)]
  4     [Guid("496B0ABF-CDEE-11d3-88E8-00902754C43A")]
  5     public interface IEnumerator
  6     {
  7         // 摘要:
  8         //     獲取集合中的當前元素。
  9         //
 10         // 返回結果:
 11         //     集合中的當前元素。
 12         object Current { get; }
 13 
 14         // 摘要:
 15         //     將枚舉數推進到集合的下一個元素。
 16         //
 17         // 返回結果:
 18         //     如果枚舉數成功地推進到下一個元素,則為 true;如果枚舉數越過集合的結尾,則為 false。
 19         //
 20         // 異常:
 21         //   System.InvalidOperationException:
 22         //     在創建了枚舉數後集合被修改了。
 23         bool MoveNext();
 24         //
 25         // 摘要:
 26         //     將枚舉數設置為其初始位置,該位置位於集合中第一個元素之前。
 27         //
 28         // 異常:
 29         //   System.InvalidOperationException:
 30         //     在創建了枚舉數後集合被修改了。
 31         void Reset();
 32     }
IEnumerator原型

當我們使用Foreach遍歷一個對象時會先執行該隊形的GetIEnumerable方法得到一個迭代器(實現的IEnumerator介面的對象),然後調用給對象的Reset方法來初始枚舉數,然後執行該對象的MoveNext()方法得到Bool值如果該方法返回真則調用該對象的Current屬性得到值在執行MoveNext()方法直到該方法返回假則退出迭代

Demo:

  1 //可供Foreach遍歷的類(實現了IEnmerable介面)
  2 public class MyList:IEnumerable
  3     {
  4         ArrayList list = new ArrayList();
  5         public void Add(object o)
  6         {
  7             list.Add(o);
  8         }
  9         public IEnumerator GetEnumerator()
 10         {
 11             return new MyIenumerator(list);
 12         }
 13     }
 14 //實現了IEnumerator介面的類
 15 public class MyIenumerator:IEnumerator
 16     {
 17         public MyIenumerator(ArrayList list)
 18         {
 19             this.list = list;
 20         }
 21         ArrayList list = new ArrayList();
 22         int I = -1;
 23         public object Current
 24         {
 25             get { return list[I]; }
 26         }
 27 
 28         public bool MoveNext()
 29         {
 30             bool falg = false;
 31             if (I<list.Count-1)
 32             {
 33                 I++;
 34                 falg = true;
 35             }
 36             return falg;
 37         }
 38 
 39         public void Reset()
 40         {
 41 
 42         }
 43     }
自定義可供foreach遍歷的類

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今晚繼續進行Sql效能問題的分享,今天主要是一些具體的sql優化方法和思路分享,若看過後你也有其他想法,歡迎一起探討,好了,進入今天的主題。 針對性地對一些耗資源嚴重的具體應用進行優化 出現效能問題時,首先要做的是什麼?這個問題我問過不少同事,有人說憑經驗對出問題的sql進行優化,如我們一般說的要合 ...
  • 今天本想將之前的一個資料庫easy.sql用圖形化工具Navicat導入的,開始是用“運行SQL文件”導入,結果是“queries successfully”啥的,去查是否導表成功,一看並沒有。 結果失望之餘,把那個資料庫和伺服器全刪了,再建一個和要導入的資料庫同名的資料庫名,意外的是重啟後資料庫就 ...
  • 1唯一約束unique和主鍵key的區別? 1、什麼是數據的存儲引擎? 存儲引擎就是如何存儲數據、如何為存儲的數據建立索引和如何更新、查詢數據等技術的實現方法。因為在關係資料庫中數據的存儲是以表的形式存儲的,所以存儲引擎也可以稱為表類型(即存儲和操作該表的類型),在Oracle和SQL Server ...
  • 1概述 1.1 介紹 Valgrind是一套Linux下,開放源代碼(GPL V2)的模擬調試工具的集合。Valgrind由內核(core)以及基於內核的其他調試工具組成。內核類似於一個框架(framework),它模擬了一個CPU環境,並提供服務給其他工具;而其他工具則類似於插件 (plug-in ...
  • 1上下鍵讓文件為選中狀態 2左鍵選擇文件夾,再次左鍵摺疊。 ...
  • 今天,筆者在備份文件的時候,將一個word文檔從移動硬碟複製到桌面。經過一系列“復(meng)雜(bi)”的操作之後,筆者突然發現,文件無法刪除了。當右鍵文件點擊“刪除”時,出現對話框顯示“正在準備 再迴圈”的字樣。 筆者嘗試了許多方法,例如:當出現“正在準備 再迴圈”字樣時,註銷電腦;下載文件粉 ...
  • 通過上一篇的介紹我們應該對實現在ServiceProvider的總體設計有了一個大致的瞭解,但是我們刻意迴避一個重要的話題,即服務實例最終究竟是採用何種方式提供出來的。ServiceProvider最終採用何種方式提供我們所需的服務實例取決於最終選擇了怎樣的ServiceCallSite,而服務註冊 ...
  • 一、題目描述 構造程式並測試,分別是: 構造程式並測試,分別是: 1.不能觸發Fault。 2.觸發Fault,但是不能觸發Error。 3.觸發Error,但是不能產生Failure。 二、結對對象 結對對象博客: 結對照片: 貢獻比例: 三、構造程式並測試 1.不能觸發Fault. 1.1:構造 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...