4

我试图描述性:) 它本身就是编程风格的问题,而不是编码问题。

假设我们有:

A:

public class MyDict {
     public Dictionary<int,string> dict;
     // do custom-serialization of "dict"
     public void SaveToFile(...);
     // customized deserialization of "dict"
     public void LoadFromFile(...);
} 

乙:

public class MyDict : Dictionary<int,string>
{

}

在编程风格方面哪个选项会更好?B类:将在外部进行反序列化。

主要问题是:创建新类(它只有一个属性 - 像 opt A:) 还是创建一个派生的新类 - 像 opt B: 更好?除了添加/删除和反序列化流之外,我不想要任何其他数据处理。

提前致谢!

4

7 回答 7

6

为什么你需要创建一个新类?或者更确切地说,为什么它必须是一个可以加载和保存自己的类?为什么不在其他地方有以下方法:

public void SaveDictionary(Dictionary<int, string> dictionary, string fie)

public Dictionary<int, string> LoadDictionary(string file)
于 2010-03-19T18:31:55.140 回答
1

我会选择选项 B。如果我想在幕后使用字典(即使其私有/受保护)并且只在我的新类中从字典中公开有限数量的功能,我只会使用选项 A。

如果您提供所有功能(如果是 Dictionary 和一些功能),那么显而易见的解决方案是从 Dictionary 继承(a la Option B)

于 2010-03-19T18:38:23.720 回答
1

我的 2 美分:

在示例 A 中 - 当我想对我的类的消费者隐藏我的代码使用 Dictionary 的事实时,我会使用这种风格。

在示例 B 中 - 当我不介意消费者知道我正在使用 Dictionary 时,我会这样做

因此,根据情况,我可能可以选择一种编码风格/策略,我认为这种想法与类是否需要序列化无关......

很想听听关于这种思路的一些评论。

HTH。

于 2010-03-19T19:09:28.333 回答
1

从我为另一个问题写的答案中:

当您想“复制”/公开基类的 API 时,您使用继承。当您只想“复制”功能时,请使用委托。

一个例子:你想从一个列表中创建一个堆栈。Stack 只有 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)
    {
    //...
    }
}

这种方法可能很棒,因为您还可以泛化静态方法以允许任何 Dictionary 专业化。

于 2010-03-19T18:43:23.063 回答
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(...);
于 2010-03-19T18:56:35.327 回答
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
    }
}
于 2010-03-19T18:52:25.720 回答
0

您可以创建自己的类来实现IDictionary<TKey, TValue>IXmlSerializable(或任何序列化接口需要您想要的功能,您可能必须创建自己的)。我想我记得在某处读到,出于某种原因,最好实现IDictionary<TKey, TValue>接口而不是继承自。Dictionary<TKey, TValue>

编辑: C# 继承自 Dictionary,迭代 KeyValuePairs是我问的关于从 Dictionary 类继承的问题。请参阅那里的答案,了解为什么这是一个坏主意。

于 2010-03-19T19:19:14.253 回答