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

时间:2010-03-19 18:27:17

标签: c# class coding-style derived-class

我试图描述一下:)这比编码问题本身就是编程风格的问题。

我们假设有:

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:更好吗? 我不希望任何其他数据处理比添加/删除和/ /序列化流。

提前致谢!

7 个答案:

答案 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类继承的问题。看到那里的答案,为什么这是一个坏主意。