假设我有一个定义接口(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/

10-10 06:45