要求包含引用以支持接口
本文关键字:支持 接口 引用 包含 | 更新日期: 2023-09-27 18:36:44
假设我有一个定义接口的库:
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
.
我只需要把它当作一个
Something
事情就是这样:当你在Something
中实现ISomething
的那一刻,它也变成了一种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#期望无条件工作的强制转换。
当 CLR 执行应用程序时,它会加载有关程序中引用的类型的所有信息。
因为Something
实现了ISomething
,所以CLR需要知道接口 - 所以包含这个接口的.dll必须可供可执行文件访问。
每当有一个库调用另一个库时,你的顶级项目中都需要这两个库。您还期望顶级项目在构建过程中如何组装所有必要的文件?