我有多個集合,如:如何在Delphi中設計單個界面以保存不同的集合?
TFooList = TObjectDictionary<string,TFoo>;
TBarList = TObjectDictionary<string,TBar>;
....
TRoot = class
value : string
end;
TFoo = class(TRoot)
...
end;
TBar = class(TRoot)
...
end;
而且我有一個接口/類,可以保存或加載的集合:
ISave = interface
procedure Save(TDictionary<string, string>);
function Load: TDictionary<string, string>;
end;
注意接口需要一個鍵/字符串對集合順序正常工作。
我實現了一些ISAVE類以加載/收集從文件或數據庫保存到/:
TDbSave = class(TInterfacedObject , ISave)
....
end;
iSave := TDbSave(ConnString)
TFileSave = class(TInterfacedObject , ISave)
....
end;
iSave := TFileSave(fileName);
所以,最後一塊會從每個集合繼承和創建保存/載入方法從TDictionary(字符串,字符串)
TFooListSavable = TFooList;
procedure Create(save_load : ISave);
procedure Save;
procedure Load;
....
end;
procedure TFooListSavable.Save
// 1. create a TDictionary<string, string>
// 2. load the dictionary above with my collection translating
// each Foo object into a string
// 3. call save_load.Save(dictionary);
end;
procedure TFooListSavable.Load
// 1. create a TDictionary<string, string>
// 2. call save_load.load to load it
// 3. Move over the collection and translate string into TFoo and
// 4. AddOrEquals each TFoo created into TFooListSavable.
end;
因此 「翻譯」 每個集合到/,我有兩個問題,這種方法:
1)保存或加載的接口需要集合中的字符串值,並且儘管每個集合中的所有對象都繼承自定義了此字符串的類,但我不知道如何將集合TDictionary<string,TFoo>
轉換爲TDictionary<string,string>
而無需訴諸上面的代碼(這將複製集合以便將其傳遞給iSave
對象)。我覺得雖然我可以替換iSave
對象來改變集合保存/加載的方式,而不用改變集合本身,但我不知道是否最好的方法來保存/加載集合相關對象。
你說得挺有道理的說,每個類(TFoo,TBAR)應該有責任把自己轉變成字符串。 但是你不認爲集合的加載/保存過程有點「面向流」嗎?我認爲編寫數據庫版本(TDbSerialize)會很困難,不是嗎? – MarcosCunhaLima
@MarcosCunhaLima不,我認爲這不會很難。我所展示的只是一個例子。如果需要,您可以將其他方法添加到ISerialize中,以便DB實現可以爲每個集合項目創建一個新記錄,然後Write方法可以根據需要更新記錄列,然後在完成時提交。或者爲要寫入的整個集合創建一個新的blob。無論你需要什麼。 –
你是對的。謝謝 – MarcosCunhaLima