4

假设我有一个定义接口的库:

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使此代码正常工作。即使我 makeISomething internal和 make LibraryOne InternalsVisibleTo LibraryTwo,我仍然必须有那个参考。 为什么?

如果我真的提到了一个ISomething,我会理解的。如果我希望Something表现得像一个ISomething,我会理解的。但我只需要把它当作一个Something.

4

3 回答 3

4

我只需要把它当作一个Something

事情就是这样:在你实现ISomethingin的那一刻Something,它就变成了ISomething。类实现接口这一事实是该类性质不可或缺的。

没有这个,您将能够继承Somethingcreate 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 {
   ...
}

现在传递一个 to 的实例SomethingElseProcessSomething完成循环:你SomethingElse是 aSomething但它不是ISomething,打破了 C# 期望无条件工作的强制转换。

于 2013-10-24T21:19:22.257 回答
3

当 CLR 执行您的应用程序时,它会加载有关程序中引用的类型的所有信息。

因为Somethingimplements ISomething,CLR 需要知道接口 - 所以包含这个接口的 .dll 必须可以被可执行文件访问。

于 2013-10-24T21:13:38.397 回答
1

每当您有一个库调用另一个库时,您在顶级项目中都需要这两个库。您还希望顶级项目在构建期间如何组装所有必要的文件?

于 2013-10-24T21:10:04.357 回答