日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

显示实现接口

發(fā)布時間:2023/11/27 生活经验 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 显示实现接口 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

接口定義了一系列的行為規(guī)范,為類型定義一種Can-Do的功能。例如,實現(xiàn)IEnumerable接口定義了GetEnumerator方法,用于獲取一個枚舉數(shù),該枚舉數(shù)支持在集合上進(jìn)行迭代,也就是我們常說的foreach。接口只是定義行為,具體的實現(xiàn)需要由具體類型負(fù)責(zé),實現(xiàn)接口的方法又分為隱式實現(xiàn)與顯示實現(xiàn)

一、隱式/顯示實現(xiàn)接口方法

  簡單的說,我們平時“默認(rèn)”使用的都是隱式的實現(xiàn)方式。例如:

interface ILog
{void Log();
}public class FileLogger : ILog
{public void Log(){Console.WriteLine("記錄到文件!");}
}

隱式實現(xiàn)很簡單,通常我們約定接口命名以 I 開頭,方便閱讀。接口內(nèi)的方法不需要用public,編譯器會自動加上。類型中實現(xiàn)接口的方法只能是public,也可以定義成虛方法,由子類重寫。現(xiàn)在看顯示實現(xiàn)的方式:

public class EventLogger : ILog
{void ILog.Log(){Console.WriteLine("記錄到系統(tǒng)事件!");}
}

與上面不同的是,方法用了ILog指明,而且沒有(也不能有)public或者private修飾符。

  除了語法上的不同,調(diào)用方式也不同,顯示實現(xiàn)只能用接口類型的變量來調(diào)用,如:

FileLogger fileLogger = new FileLogger();
fileLogger.Log(); //正確
EventLogger eventLogger = new EventLogger();           
eventLogger.Log(); //報錯
ILog log = new EventLogger();
log.Log(); //正確

二、何時使用

  1. c#允許實現(xiàn)多個接口,如果多個接口定義了相同的方法,可以用顯示實現(xiàn)的方式加以區(qū)分,例如:

 
public class EmailLogger : ILog, ISendable
{void ILog.Log(){Console.WriteLine("ILog");}void ISendable.Log(){Console.WriteLine("ISendable");}
}

 2. 增強編譯時的類型安全和避免值類型裝箱

  有了泛型,我們自然可以做到編譯時的類型安全和避免值類型裝箱的操作。但有時候可能沒有對應(yīng)的泛型版本。例如:IComparable(這里只是舉例,實際有IComparable<T>)。如:

interface IComparable
{int CompareTo(object obj);
}struct ValueType : IComparable
{private int x;public ValueType(int x){this.x = x;}public int CompareTo(object obj){return this.x - ((ValueType)obj).x;}
} //調(diào)用:
    
ValueType vt1 = new ValueType(1);
ValueType vt2 = new ValueType(2);
Console.WriteLine(vt1.CompareTo(vt2)); 

由于形參是object,上面的CompareTo會發(fā)生裝箱;而且無法獲得編譯時的類型安全,例如我們可以隨便傳一個string,編譯不會報錯,等到運行時才拋出InvalidCastException。使用顯示實現(xiàn)接口的方式,如:

public int CompareTo(ValueType vt)
{return this.x - vt.x;
}int IComparable.CompareTo(object obj)
{return CompareTo((ValueType)obj);
}  

再次執(zhí)行上面的代碼,就不會發(fā)生裝箱操作,而且可以獲得編譯時的類型安全了。但是如果我們用接口變量調(diào)用,就會再次發(fā)生裝箱并喪失編譯時的類型安全檢測能力

IComparable vt1 = new ValueType(1); //裝箱
ValueType vt2 = new ValueType(2);
Console.WriteLine(vt1.CompareTo(vt2)); //再次裝箱

三、缺點

  1. 顯示實現(xiàn)只能用接口類型變量調(diào)用,會給人的感覺是某類型實現(xiàn)了該接口卻無法調(diào)用接口中的方法。特別是寫成類庫給別人調(diào)用時,顯示實現(xiàn)的接口方法在vs中按f12都不會顯示出來。(這點有人在csdn提問過,為什么某個類型可以不用實現(xiàn)接口方法)

  2. 對于值類型,要調(diào)用顯示實現(xiàn)的方法,會發(fā)生裝箱操作。

  3. 無法被子類繼承使用。

以上圖片由“圖斗羅”提供

轉(zhuǎn)載于:https://www.cnblogs.com/ldyblogs/p/realizeinterface.html

總結(jié)

以上是生活随笔為你收集整理的显示实现接口的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。