2011-06-12 136 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使用)。

至於如何將兩個類連接在一起,請參閱已經給出的答案。