Delphi如何使用其他形式的类型?

Rob*_*Rob 4 delphi

对不起,这是一个非常新手的问题.

我正在进行维护这个庞大的应用程序.它有5种不同的形式.我们将全局变量放在一个单元中(uGlobal).但我似乎无法从数据单元(uData)访问它.

我有这个:

Unit uGlobal
type
TmyType: (alpha, beta);
...

Unit uGlobal

Stuff:  TmyType  <- error, undeclared indentifier
Run Code Online (Sandbox Code Playgroud)

当我试图将uGlobal放入uData的使用部分时,它会抱怨循环引用.所以,这里有点无能为力.他们都在同一个项目中.这是使用BDS 2006.

Dis*_*ned 5

你有一个循环引用,因为你有uGlobal想要利用内容的东西,uData反之亦然.循环引用是大型项目中的一个大问题,因为它们大大增加了复杂性 - 如果你有循环依赖,它就变得更像一个BIGGER单元.我怀疑在您的项目被认为是大型项目之前还有很长的路要走,更不用说"大规模"了.;)

您有两种可能的解决方案:

  • 使用循环依赖,使一个依赖,另一个.
  • 应用一点重新设计来完全消除问题.(将事物分解成更小的块.)

保持循环依赖

大卫已经给出了答案:至少有一个单位必须使用实施部分中的另一个.

  • 使用B使用A是绝对不允许的,但你可以认为接口和实现部分几乎就像是单独的单元本身(带有一堆特殊的引用规则).
  • 那么问问自己每个子单元需要什么?
  • 如果例如:
    • 您声明了一个类型uData interface并在其中引用了uGlobal interface,然后是uGlobal 需求 的接口,uData并且需要相应的uses子句.
    • 如果uData implementation在任何地方引用了一个类型uGlobal,那么uData implementation必须将该声明移动到接口部分.
    • 如果有一个类型uGlobal interface必须它只从当时的实现部分引用,uData那么uses子句在实现部分就可以了.
  • 如果你不幸的情况是两个接口部分中的类型引用了另一个接口部分中的类型,那么你必须通过应用删除循环依赖性的技术来进行模块化.

删除循环依赖

删除循环依赖关系需要将单位分解为更易于管理的较小单位.为此,您必须了解应用程序中每个事物之间的依赖关系.例如:

  • 假设uGlobal声明A和C.
  • A取决于C,但C不需要A.
  • 假设也uData声明B需要C
  • 但事实证明,A也需要B
  • 这就是你有循环依赖的原因

在这种情况下你所要做的就是在那里的C处声明一个新的单位.

  • 那么这两个uGlobaluData将使用uNewUnit
  • 但两者都不需要另一个
  • 您的循环依赖将完全删除.

放弃

我不以任何方式提倡你与uGlobal的方法.事实上,这是一个非常糟糕的主意,当你的项目开始变大时,它会在2个方面给你带来很大的时间.不幸的是,这个解释本身就是一个巨大的答案.

  • 完全使用全局变量是危险的并且应该避免.
  • 使用像uGlobal和uData这样的"大倾销单位"也很危险,而你只是苦苦挣扎来体验他们的问题.