加载多态对象 - 需要模式

时间:2009-12-03 20:50:53

标签: c# .net design-patterns architecture load

我需要一些非常好的方法来加载多态对象

我有基类和几个基础不知道的派生类。唯一的事情 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方法,以便正确创建相应的派生类。 我正在寻找一个好的模式。

3 个答案:

答案 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。