舉例說(shuō)明.Net Framework接口各種實(shí)現(xiàn)方法
.Net Framework可以我們提供一個(gè)部署WEB應(yīng)用程序的平臺(tái)。它的出現(xiàn)就是為了幫助開(kāi)發(fā)人員提供良好的編程環(huán)境,以助開(kāi)發(fā)人員提高自己的程序開(kāi)發(fā)效率。我們見(jiàn)天將會(huì)了解到的是.Net Framework接口的相關(guān)操作方法。#t#
接口繼承:類型繼承的是接口中的方法簽名,而非方法實(shí)現(xiàn)。
當(dāng)一個(gè)類型繼承了一個(gè)接口時(shí),它只是在允諾提供其中的方法實(shí)現(xiàn):如果沒(méi)有提供,則該類型將被認(rèn)為是抽象的,從而不可能被實(shí)例化。
.Net Framework接口僅僅是一個(gè)包含著一組虛方法的抽象類型,其中每一個(gè)方法都有他們的名稱、參數(shù)和返回值類型。但接口方法不包括任何實(shí)現(xiàn)。
接口也可以定義事件、無(wú)參屬性以及含參屬性,因?yàn)樗鼈兌贾徊贿^(guò)是映射到方法上的語(yǔ)法縮寫(xiě)而已。
如果在一個(gè)類型內(nèi)實(shí)現(xiàn)接口方法的時(shí)候忽略了virtual關(guān)鍵字,那么該方法將被認(rèn)為是一個(gè)密封的虛方法,繼承了該實(shí)現(xiàn)類型的其他類型將不可以再重寫(xiě)該方法。
當(dāng)一個(gè)類型“繼承”某個(gè)接口時(shí),它不僅要實(shí)現(xiàn)該接口定義的所有方法,還要實(shí)現(xiàn)該接口從其他接口中“繼承”而來(lái)的所有方法。
實(shí)現(xiàn)了多個(gè)接口的類型允許我們將它的對(duì)象看作這些接口中的任何一個(gè)。
.Net Framework接口舉例:
1.使用接口改變已裝箱值類型中的字段
- struct Point
 - {
 - public int x,y;
 - public void Change(int x,int y)
 - {
 - this.x=x; this.y=y;
 - }
 - public override String ToString()
 - {
 - return String.Format("({0},{1})",x,y);
 - }
 - }
 - class Program
 - {
 - static void Main(string[] args)
 - {
 - Point p=new Point();
 - pp.x=p.y=1;
 - p.Change(2,2);
 - Console.Write(p); //實(shí)現(xiàn)System.
 
Iformattable接口,調(diào)用ToString方法- Object o=p; //o指向裝箱后的Point對(duì)象,顯示(2,2)
 - Console.Write(o);
 - ((Point) o).Change(3,3);
 - Console.Write(o); //拆箱,將已裝箱Point
 
中的字段拷貝到線程堆棧上的一個(gè)臨時(shí) Point中,
這個(gè)臨時(shí)Point上的字段值改為3,但已裝箱的Point
對(duì)象不受這種改變的影響,顯示(2,2)- }
 - }
 
問(wèn)題出現(xiàn)了,C#不允許我們改變已裝箱值類型中的字段,下面利用.Net Framework接口做一個(gè)修訂:
- interface IChangeBoxedPoint
 - {
 - void Change(Int32 x, Int32 y);
 - }
 - struct Point : IChangeBoxedPoint
 - {
 - public Int32 x, y;
 - public void Change(Int32 x, Int32 y)
 - {
 - this.x = x; this.y = y;
 - }
 - /**//*.*/
 - }
 - class App
 - {
 - static void Main()
 - {
 - Point p=new Point();
 - object o=new object();
 - /**//*.*/
 - ((IChangeBoxedPoint)p).Change(4, 4);
 - //p裝箱,改變已裝箱對(duì)象,但當(dāng)Change返回后,
 
已裝箱對(duì)象立即被垃圾回收- Console.WriteLine(p); //(2,2)
 - ((IChangeBoxedPoint)o).Change(5, 5);
 - //這里沒(méi)有裝箱的必要,于是改變已裝箱對(duì)象Point的值
 - Console.WriteLine(o); //(5,5)
 
C#中沒(méi)有接口方法做不到這一點(diǎn)- }
 - }
 
2.顯示.Net Framework接口成員的實(shí)現(xiàn)
- public interface IComparable
 - {
 - Int32 CompareTo(object other);
 - }
 - struct SomeValueType:IComparable
 - {
 - private Int32 x;
 - public SomeValueType(Int32 x) { this.x = x; }
 - public Int32 CompareTo(SomeValueType other)
 - {
 - return (x - other.x);
 - }
 - Int32 IComparable.CompareTo(object other)
 - {
 - return CompareTo((SomeValueType)other);
 - }
 - }
 - public static void Main()
 - {
 - SomeValueType v1 = new SomeValueType(1);
 - SomeValueType v2 = new SomeValueType(2);
 - Int32 n;
 - n= v1.CompareTo(v2); //不進(jìn)行任何裝箱
 - n = ((IComparable)v1).CompareTo(v2);
 - //v2強(qiáng)制裝箱
 - }
 
注意三點(diǎn):
a.CompareTo方法的名字前加了接口限定名IComparable.CompareTo,它告訴CLR只有在使用一個(gè)IComparable對(duì)象引用時(shí)方法才被調(diào)用
b.IComparable.CompareTo的實(shí)現(xiàn)是將other轉(zhuǎn)型為SomeValueType后,通過(guò)調(diào)用CompareTo方法來(lái)完成的
c.IComparable.CompareTo方法前沒(méi)有public或protected訪問(wèn)修飾符
顯示.Net Framework接口方法的好處:類型安全,減少裝箱操作。















 
 
 
 
 
 
 