2012-11-26 61 views
2

我正在研究一個項目,其中每個類通常包含另一個類的實例列表。這在幾個層次上重複,所以Class1將包含Class2實例的列表,而Class2的實例又將包含Class3實例的列表等等。存儲有關類實例的其他信息的正確方法是什麼?

我想保持每個類獨立和獨立越好,這樣他們可以再次在不同項目中重複使用。

然而,在這種架構中,它經常發生,從上層階級不僅需要從較低層的訪問對象,但對他們的存儲元數據,這不應該是相關聯的對象可見。這不僅發生在相鄰的層,而且也具有彼此遠離的層。我想知道這有什麼可能的正確方法,因爲我擔心我現在使用的那個不是最好的。

我想到我的解決方案是:

  • 對於每個類,創建一個存儲addictional所需信息的包裝。這可能是矯枉過正的(我們可能只需要存儲一些數據),我不確定如何將這個概念應用於遙遠的層面。
  • 創建一個單獨的結構,其中包含元數據,並保留對象實例和元數據結構實例對。再一次,不確定如何在遠層使用此功能。
  • 在下層創建公共成員,他們不能看到/使用,只能由更高級別的類使用。這解決了這個問題,但我認爲這是非常糟糕的做法,嚴重依賴外部代碼來保持良好,而不是「觸摸」元數據。

什麼是其他可能的解決方案?

,正如addictional信息,我編碼我在C++項目,但這不應該真正涉及到我的問題。

編輯: 這是一個例子,以更好地解釋我的意思:

假設有A類和B,這是完成和單機類。然後我們有C類,它是A類實例集合的管理器。爲此,它需要存儲有關它正在管理的每個A實例的上癮信息。此外,我們有D類,它包含一個類C的實例和一個來自B類的對象集合。最後一個類需要能夠將B類的每個實例與A類的一個實例相關聯(其由C級的受控實例管理),,反之亦然

在這個例子中C和D所需的信息在哪裏以及如何存儲?

+0

什麼是元數據?只是文字?一個有屬性的類?每個班級的元數據類型*是否不同? –

+0

@BobHorn它可能是上層需要管理低級別的任何類型的信息:布爾值,字符串,向量/其他類型數據的列表等等。是的,元數據不僅在類上是不同的,而且它當然依賴於必須使用它的類(一個類可能與多個元數據結構相關聯,每個不同的上層類一個,或者如果沒有更高層)。不過,元數據類型不會在同一類的實例之間改變。 – Svalorzen

+0

我會建議使用面向對象的方法爲每個應用程序創建包裝對象(對於元數據應該無關緊要的單個位或多個列表,乾淨而有意義的API和代碼維護更重要),並在「管理員」(C類,D類) 。例如,cObject.AddA(A aObject)也會創建包裝類並存儲在C對象的另一個列表中。 dObject.AddB(B bObject)將在D的C中找到合適的A對象,然後在保存的元數據中關聯D :) – Algirdas

回答

0

我認爲你的一般問題是你想要A的實例和B的實例加上每個元素的額外元數據。因此,有一個WrappedA和WrappedB類擁有對A的引用,並且維護您需要的任何元數據。

Public class A 
{ 
} 

public class WrappedA 
{ 
    private A _underlyingInstance; 
    public WrappedA(A instanceToWrap) 
    { 
      _underlyingInstance = instanceToWrap; 
      SetAdditionalMetaData(); 
    } 

    protected SetAdditionalMetaData() 
    { 
      //use _underlyingInstance to set meta data 
    } 
} 

然後,代替具有類型A的列表具有包裝類型列表A.

public class C 
{ 
    private List<WrappedA> _myAs = null; 
    public C(A[] rawAs) 
    { 
      _myAs = new List<WrappedA>(); 
      foreach(A a in rawAs) 
      { 
       _myAs.Add(new WrappedA(a); 
      } 

    } 
} 

無論您需要將什麼方法添加到包裝類中,都可以。如果您需要存儲有關AXB的特殊信息,似乎這將是Ds的責任。 D可以創建一個以[A_B]作爲關鍵字的字典,然後將所需的關於AXB組合的任何數據存儲在該值中。

希望有所幫助。

相關問題