要求包括支持接口的引用

时间:2013-10-24 21:06:43

标签: c# 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

3 个答案:

答案 0 :(得分:4)

  

我只需要将其视为Something

事情就是这样:在ISomething中实施Something的那一刻,它也变成了ISomething。类实现接口的事实是该类性质的组成部分。

如果没有这个,您将能够继承Something来创建SomethingElseSomethingElse将无法实现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以完成圈子:您的SomethingElseSomething,但它不是ISomething,打破了演员阵容C#期望无条件地工作。

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

每当你有一个调用另一个库的库时,你需要在顶级项目中同时使用它们。您期望顶级项目在构建期间如何组装所有必需的文件?