我有一个场景,编译器抱怨我错过了所需的引用。
我有3个集会:
A.DLL
B.DLL (参考文献 A.DLL )
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不会。
答案 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.
如果构建可以通过遵循依赖关系图解析类型,那么在我看来,只要您想使用引用来强制执行特定的代码分层,就不必诉诸接口。我不知道怎么做,但接口只是你真正想要一个实现的负担,所以我希望这种事情是可能的。