C#new class只有一个属性:派生自base还是封装成new?

C# new class with only single property : derive from base or encapsulate into new?

我尝试过描述性的描述:)这与其说是编程风格的问题,不如说是编码本身的问题。

假设我们有:

答:

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

B:

1
2
3
4
public class MyDict : Dictionary<int,string>
{

}

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

主要问题是:创建新类(它只有一个属性,如opt a:)还是创建派生的新类,如opt b:?除了向流中添加/删除和取消/序列化之外,我不希望进行任何其他数据处理。

事先谢谢!


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

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

public Dictionary<int, string> LoadDictionary(string file)


我的2分钱:

在示例A中,当我想隐藏我的代码使用字典而不让类的使用者看到这一事实时,我会使用这种样式。

在示例B中,当我不介意消费者知道我在使用字典时,我会这样做。

因此,根据场景的不同,我可能可以选择一种用于编码的样式/策略。我认为这种想法与类是否需要序列化无关。

希望听到一些关于这一思路的评论。

Hth.


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

When you want to"copy"/Expose the
base class' API, you use inheritance.
When you only want to"copy"
functionality, use delegation.

One example of this: You want to
create a Stack out of a List. Stack
only has pop, push and peek. You
shouldn't use inheritance given that
you don't want push_back, push_front,
removeAt, et al.-kind of functionality
in a Stack.

另一方面,这两种方法似乎都不适合你的困境。您可以创建一个帮助器类来完成整个序列化工作,例如:

1
2
3
4
5
6
7
8
9
10
class DictionarySerializationHelper
{
    public static void Serialize(Dictionary<int, String> d, File f){
    //...
    }
    public static Dictionary<int, String> Deserialize(File f)
    {
    //...
    }
}

这种方法可能很棒,因为您还可以将静态方法归纳为允许任何字典专门化。


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

如果您提供所有的功能,如果是字典,然后是一些,那么显而易见的解决方案是从字典继承(a la选项b)


您可以创建自己的类来实现IDictionaryIXmlSerializable(或者,无论哪个序列化接口需要您想要的功能,您都可能需要创建自己的类)。我记得我在某个地方读到,出于某种原因,最好是实现IDictionary接口,而不是从Dictionary继承。

edit:c从字典继承,迭代keyValuePairs是我问的关于从字典类继承的问题。看看这里的答案,为什么这是一个坏主意。


解决问题的最佳方案取决于用例。您不会告诉我们类在您的项目中是如何使用的。如果您想要有一个非常普通的字典,并且只想添加用于加载和保存的方法,那么您应该看看扩展方法:

1
2
3
4
5
  public static class DictionaryExtensions
  {
        public static void Save(this Dictionary<int,string> yourDict, ...) {...}
        public static void Load(this Dictionary<int,string> yourdict, ...) {...}
  }

现在可以保存这样的实例:

1
2
Dictionary<int,string> dict = ....;
dict.Save(...);


您可以使用两种扩展方法

1
2
3
4
5
6
7
8
9
10
11
12
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

1
2
3
4
5
6
7
8
9
10
11
12
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
    }
}