在C#中继承并引用包含基类的DLL

时间:2012-07-23 07:20:46

标签: c# .net reference

我有一个场景,编译器抱怨我错过了所需的引用。

我有3个集会:

  • A.DLL

    • 公共类BaseClass
  • B.DLL (参考文献 A.DLL

    • public class DerivedClass:BaseClass
  • C.DLL

    var derived = new DerivedClass();

在C.DLL中,我只引用了B.DLL(我只需要访问DerivedClass)。

编译器发出错误,说我还需要引用A.DLL

这完全打破了封装,我不确定为什么需要这样做(因为B.DLL引用了A.DLL)。

编辑:关于“打破封装”的错误选择。我的意图是这导致了对这个项目(C.DLL)的额外编译时约束,因为我只是从B.DLL实例化类型,而不是从A.DLL实例化。

我希望删除此编译时要求,主要是因为B和C位于相同的解决方案中,但A不会。

2 个答案:

答案 0 :(得分:7)

  

这完全打破了封装,我不确定为什么需要这样做(因为B.DLL引用了A.DLL)。

我不知道它是如何“彻底打破封装”。

为了执行成员解析,编译器需要知道BaseClass中的内容。因此,要编译C.dll,您需要引用A.dll和B.dll。当有人编写访问DerivedClass实例的代码时,他们需要知道BaseClass支持的内容,因为它可能是DerivedClass本身覆盖的超集。

即使你不喜欢它,也就是这样。如果您不希望 compile -time需要A.dll,您可以使用合成而不是继承 - 但是您仍然需要在执行时使用A.dll - 时间无论如何。

答案 1 :(得分:1)

  

Blockquote这完全破坏了封装,我不确定为什么需要这样做(因为B.DLL引用了A.DLL)。

我看到你修改了这个词的选择,但我想我明白你的意思。如果你想确保A只能通过 B使用C ,你想引用B而不是A中的C.

我明白编译器需要同时使用B和C,但是我不明白为什么它不能根据A到B的引用以及从B到C的引用来解析它。在我看来如果我告诉你“B取决于C”和“A取决于B”,你可以推断 A还取决于C.

如果构建可以通过遵循依赖关系图解析类型,那么在我看来,只要您想使用引用来强制执行特定的代码分层,就不必诉诸接口。我不知道怎么做,但接口只是你真正想要一个实现的负担,所以我希望这种事情是可能的。