如何实例化接口

通常我们的业务交给暴露给外部使用的时候,一般情况会采用接口的方式,但有时候,我们也会也会为对外暴露的业务接口提供默认的操作方法。
很多时候,我们在别人提供的接口的默认方法时候,很难找到该接口的对应该方法(比较规范的编程方式还好找,如果是杂草式的编程方式的话,估计找半天都找不到)
由此,我们对该问题展开讨论解决。

我们都知道“接口是不能实例化接口”的。
如(错误):

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实现接口的方法











原文地址:https://www.cnblogs.com/magic_evan/p/2314881.html