通过使用基类方法,减少派生类中加载和保存方法的代码,但不进行向下转换

本文关键字:代码 方法 保存 转换 加载 基类 类方法 派生 | 更新日期: 2023-09-27 18:32:55

我正在尝试简化几个类的加载和保存方法,这些类基本上是带有一些新字段的基类。所有派生类都使用所有基类的字段,因此它们的 load/save 方法包括基类的 load/save 代码,并添加了一些行来处理派生类的剩余未处理字段。

我的第一个想法是我可以将实例作为基类加载,向下转换为派生类并继续加载其余字段,但显然您不能只是向下转换为 C# 中的派生类。经过一番思考,我想也许我可以遍历基类的所有字段成员并将这些字段值复制到派生类的新实例中,但我不确定这是执行此操作的最佳(或最快(方法。

基本上,我想做的是加载基类的实例,将其强制转换为派生类,然后完成其余字段的加载。

有没有办法在派生类的 Load 和 Save 方法中保存相同的代码行,这些方法包括基类中的所有 Load 和 Save 代码而不会向下转换?

下面是一些示例代码(真正的代码只是长了几倍(:

class Base 
{
    int i;
    static Base Load(Dictionary<string, object> dic)
    {
        Base b = new Base();
        b.i = (int)dic["i"];
        return b;
    }
}
class Derived : Base
{
    float f;
    static Derived Load(Dictionary<string, object> dic)
    {
        Derived d = new Derived();
        d.i = (int)dic["i"];
        d.f = (float)dic["f"];
        return d;
    }
}

通过使用基类方法,减少派生类中加载和保存方法的代码,但不进行向下转换

我认为您正在寻找常规序列化代码:

 class Base 
 {  
     public int Field1 {get;set;}
     virtual void Load(BinaryReader reader)
     {
         Field1 = reader.ReadInt();
     }
 }
 class Derived:Base
 {  
     public int Field2 {get;set;}
     override void Load(BinaryReader reader)
     {
         base.Load(reader);
         Field2 = reader.ReadInt();
     }
 }

用法类似于:

 Base toRead = new Derived();
 toRead.Load(reader);

你不能。猫和狗永远是动物,但动物可以是猫或狗。没有办法把猫变成狗。