抱歉,这是一个非常新手的问题。
我们正在维护这个庞大的应用程序。它有5种不同的形式。我们将全局变量放在一个单元(uGlobal)中。但我似乎无法从数据单元(uData)访问它。
我有这个:
Unit uGlobal
type
TmyType: (alpha, beta);
...
Unit uGlobal
Stuff: TmyType <- error, undeclared indentifier
当我尝试将 uGlobal 放入 uData 的使用部分时,它提示循环引用。所以,这里有点无知。他们都在同一个项目中。这是使用 BDS 2006。
最佳答案
您有循环引用,因为 uGlobal
中的内容想要使用 uData
中的内容,反之亦然。循环引用是大型项目中的一个大问题,因为它们大大增加了复杂性 - 如果您有循环依赖,它就会变得更像一个更大的单元。我怀疑在你的项目被认为是大型的之前还有很长的路要走,更不用说“大规模”了。 ;)
您有 2 种可能的解决方案:
- 采用循环依赖,使一个依赖弱,而另一个强。
- 进行一些重新设计即可完全消除问题。 (把事情分成更小的 block 。)
保持循环依赖
David 已经给出了答案:至少其中一个单元必须使用实现部分中的另一个单元。
- A 使用 B 使用 A 是绝对不允许的,但是您可以将接口(interface)和实现部分视为几乎本身是独立的单元(具有一堆特殊的引用规则)。
- 那么问问自己每个子单位需要什么?
- 如果例如:
- 您在
uData接口(interface)
中声明了一个类型,并在uGlobal接口(interface)
中引用了该类型,那么uGlobal
的接口(interface)需要uData
并且需要相应的uses子句。 - 如果
uData 实现
中的某个类型在任何uGlobal
中引用,则必须将uData 实现
中的该声明移至接口(interface)部分. - 如果
uGlobal 接口(interface)
中存在类型,则必须仅从uData
的实现部分引用该类型,那么在实现部分中使用 use 子句就可以了。
- 您在
- 如果您遇到不幸的情况,即在两个接口(interface)部分中都键入了另一个接口(interface)部分中的引用类型,那么您必须通过将该技术应用到来进一步模块化删除循环依赖。
删除循环依赖
消除循环依赖需要将您的单元分解为更易于管理的更小的单元。为此,您必须了解应用程序中每个事物之间的依赖关系。 例如:
- 假设
uGlobal
声明了A和C - A 依赖于 C,但 C 不需要 A
- 还假设
uData
声明了需要 C 的 B - 但事实证明A也需要B
- 这就是为什么你有循环依赖
在这种情况下,您所要做的就是在移动 C 处声明一个新单位。
- 然后
uGlobal
和uData
都将使用uNewUnit
- 但两者都不需要对方
- 您的循环依赖将被完全删除。
免责声明
我并不以任何方式提倡您对 uGlobal 的做法。事实上,这是一个非常糟糕的主意,当您的项目开始变大时,它会在两个方面给您带来很大的麻烦。不幸的是,这个解释本身就是一个巨大的答案。
- 使用全局变量是危险的,应该避免。
- 使用 uGlobal 和 uData 等“大型转储单位”也很危险,而且您才刚刚经历过它们的问题。
关于Delphi如何使用其他窗体中的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5356485/