【发布时间】:2019-06-05 21:23:19
【问题描述】:
我有哪些选项可以解决以下并行继承层次结构的问题?我想让 Serializer 类保持无状态。
public abstract class BaseSerializerOptions
{
public Boolean SortComponents { get; set; }
}
public class TextSerializerOptions : BaseSerializerOptions
{
public Int32 TrimStrings { get; set; }
}
public class BinarySerializerOptions : BaseSerializerOptions
{
public Boolean SkipNulls { get; set; }
}
public abstract class BaseSerializer
{
public abstract void Serialize(Object obj, Stream s, BaseSerializerOptions opt);
}
public class TextSerializer : BaseSerializer
{
public override void Serialize(Object obj, Stream s, TextSerializerOptions opt)
{
}
}
public class BinarySerializer : BaseSerializer
{
public override void Serialize(Object obj, Stream s, BinarySerializerOptions opt)
{
}
}
我希望能够编写这样的方法:
static void Test(BaseSerializer s, BaseSerializerOptions o)
{
var obj = new MyObject { ... };
using (var f = File.OpenWrite("..."))
{
s.Serialize(obj, f, o);
}
// do more things here to check the serializer result;
// the serializers might return some kind of operation status, which I want to check
}
static void TestSerializers()
{
Test(new TextSerializer(), new TextSerializerOptions {...});
Test(new BinarySerializer(), new BinarySerializerOptions {...});
}
【问题讨论】:
-
class BaseSerializer<T> where T : BaseSerializerOptions { public abstract void Serialize(Object obj, Stream s, T opt); }怎么样? -
我认为您不需要
BaseSerializer,因为目前还不清楚您将如何将它与通用选项一起使用。我个人会: 1. 完全删除BaseSerializer并为特定任务使用特定的序列化程序。 2. 将options移动到特定序列化器的构造函数中,将BaseSerializer替换为ISerializer与Serializer(object obj, Stream s)方法。 -
两个建议看起来都不错,请发布完整的答案,让作者更清楚
-
@opewix,第二个建议不是我想要的;我想保持
Serializer类无状态;我不想将选项保留为序列化程序中的状态。 -
第一个建议也不是很有帮助;我不能将
BaseSerializer<T>类用作普通的抽象基类,因为它依赖于具体的选项类。
标签: c# oop design-patterns