2011-11-01 159 views
0

我有3个项目:P1,P2和P3接口参考

在P1,还有一个接口I

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

public class C : I 
{ 
    ... 
} 

在P3,我有一类方法:

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

在编译时,P3不ñ因为接口I是在未引用的项目中定义的,所以不进行编译。为什么?

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

+1

P3中的'A'应该是'C'吗? –

+1

这不是特定于接口,它只是如何.net工作 –

+0

@詹姆斯:是的,更正。 – Johnny5

回答

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的一部分公开可见(例如,可以分配一个CI类型等的参考),即希望用C组件3需要C(组件2)和I两者的定义(组件1)

但是,如果C使用I内部(不包括其他组件可见),你就不需要refe rence 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) 
{ 
    ... 
} 

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