我有3个项目:P1,P2和P3
在P1中,有一个接口I的定义
在P2中,有一个实现接口I的C类
public class C : I
{
...
}
在P3中,我在课堂上有这个方法:
public static C getC (int id)
{
...
}
在编译时,P3无法编译,因为接口I是在未引用的项目中定义的。为什么呢?
请注意,我没有使用P3中的接口,我使用具体的类。
答案 0 :(得分:5)
原因是因为接口I
是C
的公共签名的一部分,因此当您使用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)
{
...
}
这有意义吗?因为类的基类和接口是其定义的一部分,所以任何引用程序集都需要知道它们。但是如果它们在内部使用但在外部不可见,则它们不一定需要被任何引用程序集所知。