C#中的继承和引用包含基类的dll

4
我有一个情景,编译器报错说我缺少必需的引用。我有3个程序集:
A.DLL public class 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 不在。

这完全破坏了封装性,你是什么意思? - leppie
编辑了我的问题并进一步解释了我的确切意图。 - lysergic-acid
2个回答

7
这完全破坏了封装,我不确定为什么需要这样做(因为B.DLL引用了A.DLL)。
我不明白它如何“完全破坏了封装”。
为了执行成员解析,编译器需要知道BaseClass中有什么。 因此,要编译C.dll,您需要引用A.dll和B.dll。 当有人编写访问DerivedClass实例的代码时,他们需要知道BaseClass支持什么,因为它很可能是DerivedClass本身覆盖的超集。
即使您不喜欢它,那也是它的方式。 如果您不希望在编译时需要A.dll,则可以使用组合而不是继承-但是在执行时仍然需要A.dll。

同意。在C语言中,你知道DerivedClass是从BaseClass派生而来的。现在C需要知道BaseClass是如何定义的。 - EricSchaefer
即使你只是从 B.dll 实例化一个类型,你仍然需要了解它继承自哪个类型,以了解可用的成员。为什么这在编译时对你来说是“不好”的呢?这基本上是不可避免的,我认为这是完全合理的。 - Jon Skeet
也许在后来的C#版本中有所改变,但我刚刚尝试了一下,我可以在C.DLL中实例化DerivedClass(遵循OP的示例)。 我无法使用DerivedClass的方法(即使它们与BaseClass无关), 但是,即使它们使用上述方法或来自BaseClass的东西,我仍然可以使用DerivedClass的属性。现在我真的很困惑! - v01pe
@v01pe:我需要更多的细节才能发表评论,但我想指出的是,.NET工具(而不是语言)随着时间的推移已经改变,以更简单地支持传递依赖项。 - Jon Skeet
谢谢@JonSkeet,这是我需要解决的另一个缺失的部分,虽然不是必须的:) 我花了很长时间来构思搜索策略以寻找我的问题的答案,但最终在这里找到了:https://dev59.com/2lUK5IYBdhLWcg3wmxCw - v01pe
显示剩余2条评论

2

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

我看到你修改了这些措辞,但我认为我理解了你的意思。如果您想确保A只能通过B使用C,则希望从A引用B而不是从A引用C。

我确实明白编译器需要同时使用B和C,但我不明白为什么它不能基于从A到B的引用和从B到C的引用进行解析。 如果我告诉您“B依赖于C”和“A依赖于B”,似乎您可以推断出A也依赖于C。

如果构建可以通过跟随依赖关系图来解析类型,那么在您想要使用引用来强制执行特定代码分层时,就不必诉诸接口。 我不知道还有其他方法,但在您真正只想要一个实现的情况下,接口只是一种负担,因此我希望这种事情是可能的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接