假设我有一个定义接口(interface)的库:
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
。 最佳答案
事情就是这样:在 ISomething
中实现 Something
的那一刻,它也变成了 ISomething
。类实现接口(interface)的事实是该类性质不可或缺的一部分。
没有这个,您将能够继承 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# 期望无条件工作的强制转换。关于c# - 包含引用以支持接口(interface)的要求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19576657/