2011-11-01 126 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) 
{ 
    ... 
} 

這有道理嗎?因爲類的基類和接口是其定義的一部分,所以它們需要被任何引用程序集知道。但是如果它們在內部使用但在外部不可見,那麼它們不一定需要被任何引用程序集知道。