2012-06-09 25 views
5

我知道循環引用(class a擁有類b和類b擁有類a)。但是由於我沒有編程,我很難找到使用它們的理由。我想知道是否人們可以給我一些很好的例子,並可能解釋使用它們的好理由。帶類的循環引用的原因?

例如,現在我正在查看2D源代碼教程,並且用戶創建了一個相互引用的Creature和CreatureAi類。是什麼原因?我還不知道,這就是爲什麼我正在尋找示例並仍在閱讀。

回答

10

循環引用的最明顯的例子是自引用:您需要鏈接列表,樹和許多其他遞歸結構。

循環引用通常隱含在相關類的層次結構中,例如具有任意嵌套的UI元素或表達式樹。最後,循環引用的一個常見情況是雙向的父 - 子關係:父級(例如UI面板)持有對其子級數組的引用,並且每個子級(例如按鈕,表等)都包含對父項的引用。家長需要發送動機給其子女,告訴他們,它變得啓用,禁用,可見或不可見;孩子可能會通知父母需要調整大小,更改視覺狀態等。

最後一個示例可能類似於您的Creature-CreatureAI對:它們是分開的,因爲它們的擔憂是不相似的,但它們具有對每個其他因爲他們需要在不同的任務上合作。

11

您有一個公司,其中包含一個爲其工作的個人列表。集合中的每個Individual類實例都包含對其工作公司的引用。

通過這種方式,您可以輕鬆找出哪些公司適用於哪些公司。請注意,它可能不一定是最好的設計,特別是如果使用ORM或文檔數據庫將類保存到數據庫中。

+0

它可能實際上是* only *設計,如果您使用的是說OrmLite,您必須在代碼本身中指定外部關係。但是,我也不喜歡它。 – Voo

0

通常這不是必須的,但它爲處理對象的代碼提供了高級的便利。

其他時候,這確實是需要的。例如,一些關係需要用代碼表示爲數據結構,而關係是自反的。

2

有任何數目的原因自參考或參考週期

  • 它們可以是在領域模型中固有的;例如人們有孩子也是人,文件夾包含其他東西,包括其他文件夾。自我引用或循環是實現這些事情的自然方式。

  • 它們可能是通用或專用數據結構所固有的;例如。一個鏈表由包含對列表中「下一個」和「前一個」節點的引用的節點組成,這就要求Node類引用它自己。

  • 循環引用背後的推理可以是應用程序設計的基本部分。或者,它可能只是一種實現方便,或者是以前的重構或代碼庫演化的歷史人造物。

基本上,您需要在應用程序代碼庫中查找(整體)以確定這些循環依賴關係存在的原因......以及是否真的有必要。