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

时间:2011-03-18 18:48:01

标签: delphi

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

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

我有这个:

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

Unit uGlobal

Stuff:  TmyType  <- error, undeclared indentifier

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

3 个答案:

答案 0 :(得分:5)

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

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

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

保持循环依赖

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

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

删除循环依赖

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

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

在这种情况下你要做的就是在那里的C处宣布一个新单位。

  • 然后,uGlobaluData都会使用uNewUnit
  • 但两者都不需要其他
  • 您的循环依赖将完全删除。

声明

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

  • 使用全局变量是危险的,应予以避免。
  • 使用像uGlobal和uData这样的“大倾销单位”也很危险,而你只是满足于体验他们的问题。

答案 1 :(得分:4)

使用第二个“使用”,即“实施”部分中的“使用”

unit uData;

uses SysUtils, etc;

type
  etc;

implementation

uses uGlobal;

// here you can reference things in uGlobal

答案 2 :(得分:2)

一般来说,David Zimmerman的答案是要走的路,但在你的情况下(根据你对David回答的回答),你需要在uGlobal单元的接口部分中使用TMyType;因此,将uData添加到实现部分的uses子句将无济于事。

似乎是重构的时候了;你应该考虑将TMyType或Stuff移动到第三个单元,这样uData和uGlobal都可以引用它。