如何實例化接口


通常我們的業務交給暴露給外部使用的時候,一般情況會采用接口的方式,但有時候,我們也會也會為對外暴露的業務接口提供默認的操作方法。
很多時候,我們在別人提供的接口的默認方法時候,很難找到該接口的對應該方法(比較規范的編程方式還好找,如果是雜草式的編程方式的話,估計找半天都找不到)
由此,我們對該問題展開討論解決。

我們都知道“接口是不能實例化接口”的。
如(錯誤):

public interface IErrorFace
{
void Error();
}
//錯誤的使用接口方式:
IErrorFace ef = new IErrorFace();

但我們可以通過實現接口來完成這一個功能。
如(正確):

public interface IErrorFace
{
void Error();
}

public class ErrorFace:IErrorFace
{
public void Error()
{
//TODO
}
}
//使用接口:
IErrorFace ief = new ErrorFace();
ief.Error();//已在ErrorFace實現接口IErrorFace的方法

但是我們采用了上面的正確方法,最終我們還是需要很努力的找出該接口對應的默認方法,那有沒有一種方法可以按上面錯誤的方式使用,又能按上面正確方式執行里面的方法呢?

下面我們請出幾個特性來解決這一難題:ComImport,Guid,CoClass,這些特性位於:using System.Runtime.InteropServices;命名空間中
我們將以上兩種方式合並得到:

[ComImport]
[Guid("12341234-1234-1234-1234-123412341234")]
[CoClass(typeof(ErrorFace))]
public interface IErrorFace
{
void Error();
}

public class ErrorFace:IErrorFace
{
public void Error()
{
//TODO
}
}
//使用接口:
IErrorFace ief = new IErrorFace();
ief.Error();
IErrorFace ief1 = new ErrorFace();
ief1.Error();

當然,我們也新寫一個對象來繼續這個接口:

public class ErrorFaceV1:IErrorFace
{
public void Error()
{
//TODO
}
}
//使用接口:
IErrorFace ief = new ErrorFaceV1();
ief.Error();//在ErrorFace實現接口的方法

但是有一點就是,這種接口的語法糖無法在外部識別其CoClass通過InteropClass編譯時,只能通過內部編譯別。
如:

public class ErrorFaceV2
{
public void ErrorUse()
{
//TODO
}
}

以上的代碼並沒有繼承IErrorFace接口,但它卻可以編寫如下(在編譯過程中不會報錯):

//使用接口:
IErrorFace ief = new ErrorFaceV1();
ErrorFaceV2 v2=(ErrorFaceV2)ief;//該轉換在執行過程出錯,在編譯過程不會出錯。
ief.Error();//在ErrorFace實現接口的方法











 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM