顯示實現介面

2021-08-08 17:20:51 字數 2315 閱讀 5371

介面定義了一系列的行為規範,為型別定義一種can-do的功能。例如,實現ienumerable介面定義了getenumerator方法,用於獲取乙個列舉數,該列舉數支援在集合上進行迭代,也就是我們常說的foreach。介面只是定義行為,具體的實現需要由具體型別負責,實現介面的方法又分為隱式實現與顯示實現。

一、隱式/顯示實現介面方法

簡單的說,我們平時「預設」使用的都是隱式的實現方式。例如:

inte***ce

ilog

public

class

filelogger : ilog

}

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

public

class

eventlogger : ilog

}

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

除了語法上的不同,呼叫方式也不同,顯示實現只能用介面型別的變數來呼叫,如:

filelogger filelogger = new

filelogger();

filelogger.log();

//正確

eventlogger eventlogger = new

eventlogger();

eventlogger.log();

//報錯

ilog log = new

eventlogger();

log.log();

//正確

二、何時使用

1. c#允許實現多個介面,如果多個介面定義了相同的方法,可以用顯示實現的方式加以區分,例如:

public

class

emaillogger : ilog, isendable

void

isendable.log()

}

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

有了泛型,我們自然可以做到編譯時的型別安全和避免值型別裝箱的操作。但有時候可能沒有對應的泛型版本。例如:icomparable(這裡只是舉例,實際有icomparable)。如:

inte***ce

icomparable

struct

valuetype : icomparable

public

int compareto(object

obj)

}   

//呼叫:

valuetype vt1 = new valuetype(1

);valuetype vt2 = new valuetype(2

);console.writeline(vt1.compareto(vt2));

由於形參是object,上面的compareto會發生裝箱;而且無法獲得編譯時的型別安全,例如我們可以隨便傳乙個string,編譯不會報錯,等到執行時才丟擲invalidcastexception。使用顯示實現介面的方式,如:

public

intcompareto(valuetype vt)

int icomparable.compareto(object

obj)

再次執行上面的**,就不會發生裝箱操作,而且可以獲得編譯時的型別安全了。但是如果我們用介面變數呼叫,就會再次發生裝箱並喪失編譯時的型別安全檢測能力

icomparable vt1 = new valuetype(1); //

裝箱valuetype vt2 = new valuetype(2

);console.writeline(vt1.compareto(vt2));

//再次裝箱

三、缺點

1. 顯示實現只能用介面型別變數呼叫,會給人的感覺是某型別實現了該介面卻無法呼叫介面中的方法。特別是寫成類庫給別人呼叫時,顯示實現的介面方法在vs中按f12都不會顯示出來。(這點有人在csdn提問過,為什麼某個型別可以不用實現介面方法)

2. 對於值型別,要呼叫顯示實現的方法,會發生裝箱操作。

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

以上由「圖鬥羅」提供

C 介面,顯示實現介面

介面中的成員不能加 訪問修飾符 介面中的成員訪問修飾符為public,不能修改。類中的成員預設的訪問修飾符是private 而介面中預設的訪問修飾符是public 預設為public 介面中的成員不能有任何實現 光說不做 只是定義了一組未實現的成員 顯示實現介面的目的 解決方法的重名問題 什麼時候顯...

介面的顯示實現

介面實現除了一般的隱式實現外,還有第二種方式 顯示實現。explicit implement 隱式實現可以同時用介面型別和子型別的例項呼叫,而顯示實現只能用介面型別的例項呼叫。也就是說,顯示實現時,類例項沒有許可權呼叫介面中的方法。並且,同時乙個類可以同時用顯示和隱式實現介面的同乙個方法。那麼,顯示...

vue實現介面資料顯示

方法一 import request from utils request export default script 方法二 直接在main.js 中引入axios 使用vue 把axios註冊到他的原型上 此時就不需要再引入axios了,直接this.axios就可以了。引入axios的檔案 i...