2011-06-12 98 views
3

我有我的主要形式。 Form_MainDelphi - 从另一个对象访问对象实例数据

它创建两个类的两个实例。

Candle_Data : TCandle_Data; 
Indicator_2700 : TIndicator_2700; 

为了Indicator_2700正确计算它的价值就必须从内它的方法获得的obect Candle_Data蜡烛数据。那么Indicator_2700如何访问Candle_Data中的数据? Form_Main是否必须在构造函数时将它作为参数传递?

这两个Class声明都在它们自己的单元文件中。

回答

2

TIndicator_2700可能有一个属性,将它链接到与其自己的实例相关的TCandle_Data实例,或者您应该将其作为参数提供给需要访问数据的方法。

您肯定可以将TCandle_Data实例传递给Indicator_2700的构造函数,并在结果实例中存储引用,直到您需要为止。

+0

我认为这只是另一种方式('TIndicator'需要'TCandleData'),但除了这个好的答案(+1):属性和构造函数注入是明显的解决方案。 – jpfollenius 2011-06-12 12:38:23

+0

好点!我会修改答案,以免混淆。 – 2011-06-12 12:39:57

2

你可以使用任何的下列(非详尽)方法:

  1. 传递给需要它的任何方法的对象引用作为参数。当然,您需要掌握Candle_Data,因此这种方法的适用性实际上取决于调用者的身份。
  2. 将Candle_Data对象引用传递给另一个对象的构造函数,然后将其存储在私有成员字段中。
  3. 使对象引用主窗体的单个实例的公共属性并以此方式访问它。

我们没有足够的信息来告诉你哪种方法最好,但起点总是比全局状态更喜欢参数和局部变量。

+0

+1非常完整的答案 – jpfollenius 2011-06-12 12:39:02

0

Both class declarations are in their own unit file.

这表明两者与另一方无关。但你仍然希望有一个知道另一个。这听起来像是一个小小的设计混搭,但并不一定如此。

有多种解决方案,这里有他们三个,每个都有自己的目的:

  • 放置在同一个单位两个班,只有两个类有一个共同的主题/主题(如TCarTAirplane在单位Transport),
  • 使用一个在另一个单元单元,仅在这两个单元代表不同的主题,但一个可能取决于其他(例如单元Transport上使用单元FuelTCar需要TDiesel,但TDiesel不需要TCar)。这只适用于单向。 Delphi以两种方式防止使用编译器错误:“对'燃料'的循环单元引用”。唯一的解决方法是使用实​​现部分中的第二个单元,但通常被认为是一个大的nono。
  • 声明新的基类中一个新的单位,只有当基类具有共同的主题,但最终的后代不这样(例如TFuel用于所有运输类,如TCarTAirplaneTHorse,但TFoodTFuel的后裔)仅被THorseTPerson使用)。

至于如何将两个类连接在一起,请参阅已经给出的答案。