介面 什麼是介面? 介面代表一種能力,和抽象類類似但比抽象類的抽象程度更高! 介面的定義: 1 public interface IEat//定義一個介面 2 { 3 void Eat(string food);//為該介面定義一種能力 4 } 從上邊的例子中我們可以看到,介面中的方法是沒有方法體的 ...
介面
什麼是介面?
介面代表一種能力,和抽象類類似但比抽象類的抽象程度更高!
介面的定義:
1 public interface IEat//定義一個介面 2 { 3 void Eat(string food);//為該介面定義一種能力 4 }介面的定義
從上邊的例子中我們可以看到,介面中的方法是沒有方法體的甚至連訪問修飾符都沒有。而且在介面中只能有方法、屬性、索引器及事件!
介面的使用:
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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:
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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遍歷的類