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)
您可以创建自己的类来实现
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 } } |
或者,如果你只使用
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 } } |