我需要一些非常好的方法来加载多态对象
我有基类和几个基础不知道的派生类。唯一的事情 base class knows是Type enum,它定义了它的实际类。
class Order
{
OrderType Type;
bool Load(string filename)
{
// load Type
}
}
class LimitOrder : Order
{
// some data
bool Load(string filename)
{
// load some data
}
}
我需要为基类Order编写一个Load方法,以便正确创建相应的派生类。 我正在寻找一个好的模式。
答案 0 :(得分:2)
最简单的方法是使用.Net
的内置二进制序列化程序 IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
formatter.Serialize(stream, obj);
并将此代码放在某种OrderFactory
中class OrderFactory
{
public static Order Load(string filename) {...}
public static void Save(string filename, Order order) {...}
}
答案 1 :(得分:1)
由于您有此要求:
我有基类和几个基础不知道的派生类。基类知道的唯一东西是Type enum,它定义了它的实际类。
为了实现这一点,您的派生类将需要提供某种形式的基类注册。一种方法可以是在基类中定义静态Dictionary<MyTypeEnum,Func<Order>>
,并允许子类向基类注册自己,以便动态地将类型的特定创建函数添加到基类。这样,当解析文件时,基类只需调用适当的函数来创建派生类型。
答案 2 :(得分:1)
如果您不想使用.NET的内置序列化程序,则需要某种factory method。您可以将它放在单独的工厂对象中,或者在基类中创建一个静态函数:
class Order
{
public static Order CreateOrder(string filename)
{
Stream stream = new FileStream(filename);
string typeinfo = stream.ReadLine();
Type t=null;
if(typeinfo=="LimitOrder") // this can be improved by using "GetType"
t=typeof(LimitOrder);
else if(typeinfo==/* what ever your types are*/
t= //...
ConstructorInfo consInfo = t.GetConstructor(new Type[0]);
Order o= (Order)consInfo.Invoke(new object[0]);
o.Load(stream);
stream.Close();
return o;
}
}
为了使其工作,每个Order子类必须具有带0参数的构造函数和带有stream参数的虚拟Load方法。并且文件中的第一行必须是typeinfo。