跨项目的接口参考

时间:2011-11-01 20:11:09

标签: c# interface reference

我有3个项目:P1,P2和P3

在P1中,有一个接口I的定义

在P2中,有一个实现接口I的C类

public class C : I
{
    ...
}

在P3中,我在课堂上有这个方法:

public static C getC (int id)
{
   ...
}

在编译时,P3无法编译,因为接口I是在未引用的项目中定义的。为什么呢?

请注意,我没有使用P3中的接口,我使用具体的类。

1 个答案:

答案 0 :(得分:5)

原因是因为接口IC的公共签名的一部分,因此当您使用C时,它还必须知道接口定义。因此,它需要参考组件。

举例说明:

// Assembly 2
public class C : I
{
    ...
}

// Assembly 3 - needs definition of `I` from assembly 1 because part of `C`
// public definition.
public static C getC (int id)
{
   ...
}

因为I作为C的一部分公开显示(例如,您可以将C分配给I类型的引用,等等),程序集3想要使用C需要C(程序集2)和I(程序集1)的定义

但是,如果C在内部使用I(其他程序集不可见),则无需引用I的程序集即可使用C。例如:

// Assembly 2
public class C 
{
    private I _someInternalUseOfI = ...;
    ...
}

// Assembly 3 - Since in this case, `I` is only used privately in assembly 2,
// only assembly 2 needs the reference to `I` in assembly 1.
public static C getC (int id)
{
   ...
}

这有意义吗?因为类的基类和接口是其定义的一部分,所以任何引用程序集都需要知道它们。但是如果它们在内部使用但在外部不可见,则它们不一定需要被任何引用程序集所知。