2010-10-19 73 views
1

當談到屬性列表時,我的意思是存儲一個類的附加信息的通用列表。你將如何實現屬性列表?

最簡單的情況:
一個班有一個std::map<std::string, std::string>。第一個字符串命名屬性(如"Color"),第二個字符串描述該值(如"Yellow")。
在本例中,使用這些屬性的另一個類需要檢查映射中是否存在某個特定的屬性名稱,然後解析該值。
但是,在談論性能時,這不是最好的概念。

你將如何實現這樣一個屬性列表?
是否有任何設計模式或庫只是做這樣的事情?

我特別感興趣的是C++ - 這樣做的方式,但是如果有獨立於語言的解決方案,請發佈它們。

在類需要動態屬性且用戶不想爲每個屬性繼承的情況下,可以使用屬性列表。
是否有幫助,你可以檢查我的有關該主題的其他問題:
Attributelists or inheritance jungle?

編輯:
當然,我忘了一些資料(多虧了註釋):
的屬性可以被應用到對象。對於同一類的對象可能有不同的屬性。對象所具有的屬性可能會發生變化(值可能會更改,可能會添加/刪除屬性)
希望這可以讓我們更清楚一點。

+0

這些「屬性」是每個類還是它們是每個對象?屬性在運行時可能會發生變化嗎?你打算如何使用屬性?這是一個有趣的問題,但是你沒有詳細說明屬性列表的要求。 – 2010-10-19 06:44:33

+0

在硅片的權利 - 你設計這個基於你的實際要求重新運行的靈活性,內存使用情況,性能等..它可能是一個枚舉/字符串/ ints/boost的任何地圖:: boost :: any,variants,abstract base類,等等,或者如果你認爲你之前關於在這樣的「屬性列表」和繼承之間進行選擇的問題是相關的,那麼它意味着需求甚至是模糊的。 – 2010-10-19 07:05:43

回答

2

我做了類似的事情。

如果這些屬性對於您的類的所有實例都是通用的,請對您的類進行單獨的元描述,以在其中描述屬性。然後,每個實例提供一個類型爲boost :: any的簡單向量(我不使用boost :: any,而是我們自己寫的類似的東西)。

如果每個實例的屬性可能不同,請爲每個實例創建一個映射,其中鍵是原子,值爲boost :: any(或類似的東西)。在Windows下原子是一種字符串的數字表示形式。首先使用字符串來表示「屬性名稱」,然後將其轉換爲原子並將其用作地圖中的鍵。使用數字原子而不是字符串將加快地圖中屬性的查找(只要您將原子值保存在某處,並且每次需要屬性值時都不需要執行字符串到原子的查找)。

不要使用屬性作爲存儲類數據成員的常規方式。如果你這樣做,調試將變成一場噩夢,因爲你很難看出你班級的實際價值。同時把觀察點也將變得不可能。

僅使用這些屬性來存儲你不能把一個正常的數據成員的東西,如: - 你不知道的屬性事先(例如,它們可以是客戶特定的) - 你不希望引入兩個類別之間的依賴關係(即使通過名稱)

1

請在Boost Property Map中查看dynamic property maps

動態屬性具體映射 地址需要到 屬性映射,其檢查是 延遲到運行時的接口。幾個組件 結合起來提供對動態 屬性映射的支持。 dynamic_properties 類收集一組異構 對象,該對象爲 Boost Property Map庫中的概念建模。每個 屬性映射圖被分配一個 字符串密鑰,當它被添加到 集合中時,它可以使用該密鑰尋址到 。在內部, dynamic_properties將每個 包含的屬性有圖有 動態屬性映射接口, 提供get和put 可以使用任何類型的 滿足幾個要求的值來調用的函數。 在內部,動態屬性圖 將鍵和值對轉換爲符合 屬性圖的要求,或者如果不能,則會通知運行時發生異常 異常。