4

我有一个场景,编译器抱怨我缺少所需的参考。

我有 3 个程序集:

  • 动态链接库

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

    • 公共类 DerivedClass : BaseClass
  • C.DLL

    var 派生 = 新 DerivedClass();

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

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

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

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

我希望删除这个编译时要求,主要是因为 B 和 C 位于同一个解决方案中,但 A 没有。

4

2 回答 2

7

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

我看不出它是如何“完全打破封装”的。

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

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

于 2012-07-23T07:23:25.863 回答
2

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

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

我明白编译器需要同时使用 B 和 C,但我不明白为什么它不能根据 A 到 B 和 B 到 C 的引用进行解析。在我看来,如果我'已经告诉过你“B 依赖于 C”和“A 依赖于 B”,你可以推断A 也依赖于 C。

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

于 2013-10-14T13:15:11.417 回答