我试图描述一下:)这比编码问题本身就是编程风格的问题。
我们假设有:
A:
public class MyDict {
public Dictionary<int,string> dict;
// do custom-serialization of "dict"
public void SaveToFile(...);
// customized deserialization of "dict"
public void LoadFromFile(...);
}
B:
public class MyDict : Dictionary<int,string>
{
}
在编程风格方面哪个选项更好? B级:将在外部进行去序列化。
主要问题是:创建新类(它只有一个属性 - 比如选择A :)或者创建一个新派生类 - 比如选择B:更好吗? 我不希望任何其他数据处理比添加/删除和/ /序列化流。
提前致谢!
答案 0 :(得分:6)
为什么你需要创建一个新类?或者更确切地说,为什么它必须是一个可以加载和保存本身的类?为什么不在其他地方使用方法:
public void SaveDictionary(Dictionary<int, string> dictionary, string fie)
public Dictionary<int, string> LoadDictionary(string file)
答案 1 :(得分:1)
我会选择选项B.如果我想在幕后使用词典(即将其设为私有/受保护),我只会使用选项A,并且只在我的新班级中从词典中公开有限数量的功能
如果你提供所有的功能,如果词典,然后一些,显而易见的解决方案将继承自词典(一个选项B)
答案 2 :(得分:1)
从我为另一个问题写的答案:
当你想“复制”/曝光时 基类'API,你使用继承。 当你只想“复制” 功能,使用委托。
这方面的一个例子:你想要 从列表中创建一个堆栈。堆 只有pop,push和peek。您 不应该使用继承 你不想要push_back,push_front, removeAt等等 - 一种功能 在堆栈中。
另一方面,这两种方法似乎都不是最适合你进退两难的方法。您可以创建一个辅助类来执行整个序列化工作,例如:
class DictionarySerializationHelper
{
public static void Serialize(Dictionary<int, String> d, File f){
//...
}
public static Dictionary<int, String> Deserialize(File f)
{
//...
}
}
这种方法可能很棒,因为你也可以概括静态方法以允许任何字典专业化。
答案 3 :(得分:1)
我的2美分:
在示例A中 - 当我想隐藏我的代码使用我班级消费者的词典时,我会使用这种风格。
在样本B中 - 当我不介意消费者知道我正在使用词典
时,我会这样做因此,根据具体情况,我可能会选择一种风格/策略进行编码&amp;我认为这个想法与课程需要序列化的事实无关......
很想听听有关这一思路的评论。
HTH。
答案 4 :(得分:0)
您可以随时使用几种扩展方法
public static class DictionaryExtensions
{
public static void Save<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, string fileName)
{
// TODO: save logic
}
public static void Load<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, string fileName)
{
// TODO: load logic
}
}
或者,如果您只使用Dictionary<int, string>
public static class DictionaryExtensions
{
public static void Save(this Dictionary<int, string> dictionary, string fileName)
{
// TODO: save logic
}
public static void Load(this Dictionary<int, string> dictionary, string fileName)
{
// TODO: load logic
}
}
答案 5 :(得分:0)
最佳解决方案问题取决于用例。您没有告诉我们您的项目中如何使用该类。如果你想拥有一个非常普通的Dictionary并且只想添加加载和保存的方法,你应该看一下扩展方法:
public static class DictionaryExtensions
{
public static void Save(this Dictionary<int,string> yourDict, ...) {...}
public static void Load(this Dictionary<int,string> yourdict, ...) {...}
}
现在您可以保存这样的实例:
Dictionary<int,string> dict = ....;
dict.Save(...);
答案 6 :(得分:0)
您可以创建自己的类来实现IDictionary<TKey, TValue>
和IXmlSerializable
(或者无论哪个序列化接口需要您需要的功能,您可能必须创建自己的功能)。我想我记得在某个地方读过,由于某种原因,最好是实现IDictionary<TKey, TValue>
接口而不是继承Dictionary<TKey, TValue>
。
编辑: C# inherit from Dictionary, iterate over KeyValuePairs是我询问从Dictionary类继承的问题。看到那里的答案,为什么这是一个坏主意。