介面定義了一系列的行為規範,為型別定義一種can-do的功能。例如,實現ienumerable介面定義了getenumerator方法,用於獲取乙個列舉數,該列舉數支援在集合上進行迭代,也就是我們常說的foreach。介面只是定義行為,具體的實現需要由具體型別負責,實現介面的方法又分為隱式實現與顯示實現。
一、隱式/顯示實現介面方法
簡單的說,我們平時「預設」使用的都是隱式的實現方式。例如:
inte***ce隱式實現很簡單,通常我們約定介面命名以 i 開頭,方便閱讀。介面內的方法不需要用public,編譯器會自動加上。型別中實現介面的方法只能是public,也可以定義成虛方法,由子類重寫。現在看顯示實現的方式:ilog
public
class
filelogger : ilog
}
public與上面不同的是,方法用了ilog指明,而且沒有(也不能有)public或者private修飾符。class
eventlogger : ilog
}
除了語法上的不同,呼叫方式也不同,顯示實現只能用介面型別的變數來呼叫,如:
filelogger filelogger = new二、何時使用filelogger();
filelogger.log();
//正確
eventlogger eventlogger = new
eventlogger();
eventlogger.log();
//報錯
ilog log = new
eventlogger();
log.log();
//正確
1. c#允許實現多個介面,如果多個介面定義了相同的方法,可以用顯示實現的方式加以區分,例如:
public2. 增強編譯時的型別安全和避免值型別裝箱class
emaillogger : ilog, isendable
void
isendable.log()
}
有了泛型,我們自然可以做到編譯時的型別安全和避免值型別裝箱的操作。但有時候可能沒有對應的泛型版本。例如:icomparable(這裡只是舉例,實際有icomparable)。如:
inte***ce由於形參是object,上面的compareto會發生裝箱;而且無法獲得編譯時的型別安全,例如我們可以隨便傳乙個string,編譯不會報錯,等到執行時才丟擲invalidcastexception。使用顯示實現介面的方式,如:icomparable
struct
valuetype : icomparable
public
int compareto(object
obj)
}
//呼叫:
valuetype vt1 = new valuetype(1
);valuetype vt2 = new valuetype(2
);console.writeline(vt1.compareto(vt2));
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...