假设我有一个定义接口的库:
namespace LibraryOne
{
public interface ISomething
{
void DoSomething();
}
}
我在第二个库中实现了这个
namespace LibraryTwo
{
public class Something : ISomething
{
public void DoSomething() { throw new Exception("I don't know how to do anything!"); }
}
}
然后我在第三个库中使用这个类
namespace LibraryThree
{
public class MyClass
{
private Something myThing = new Something();
public void DoIt() {
myThing.DoSomething();
}
}
}
Visual Studio告诉我,LibraryThree
必须引用LibraryOne
才能使此代码生效。即使我制作ISomething
internal
并制作LibraryOne
InternalsVisibleTo
LibraryTwo
,我仍然需要参考。 为什么?
如果我真的提到ISomething
,我明白了。如果我希望Something
表现得像ISomething
,我明白了。但我只需将其视为Something
。
答案 0 :(得分:4)
我只需要将其视为
Something
事情就是这样:在ISomething
中实施Something
的那一刻,它也变成了ISomething
。类实现接口的事实是该类性质的组成部分。
如果没有这个,您将能够继承Something
来创建SomethingElse
,SomethingElse
将无法实现ISomething
。现在考虑这个例子:
public class Something : ISomething
{
public void DoSomething() { ... }
// Add this method
public void ProcessSomething(Something other) {
ISomething byInterface = other; // This is legal
// Now do something with byInterface
}
}
您的假设代码执行此操作:
public class SomethingElse : Something {
...
}
现在将SomethingElse
的实例传递给ProcessSomething
以完成圈子:您的SomethingElse
是Something
,但它不是ISomething
,打破了演员阵容C#期望无条件地工作。
答案 1 :(得分:3)
当CLR执行您的应用程序时,它会加载有关程序中引用的类型的所有信息。
因为Something
实现了ISomething
,所以CLR需要知道接口 - 所以包含这个接口的.dll必须可以被可执行文件访问。
答案 2 :(得分:1)
每当你有一个调用另一个库的库时,你需要在顶级项目中同时使用它们。您期望顶级项目在构建期间如何组装所有必需的文件?