Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有多重继承和序列化的复杂系统的Memento模式_C#_.net_Unity3d - Fatal编程技术网

C# 具有多重继承和序列化的复杂系统的Memento模式

C# 具有多重继承和序列化的复杂系统的Memento模式,c#,.net,unity3d,C#,.net,Unity3d,在我的项目中,我有许多不同的对象,这些对象的状态必须保存。所以我实现了记忆模式。我需要知道如何同时序列化它们,以及如何在反序列化后找到memento源对象 我有baseMemento类和它的继承者 [System.Serializable] public abstract class Memento {} [System.Serializable] public CharacterProgressMemento : Memento{/*public fields and realization*

在我的项目中,我有许多不同的对象,这些对象的状态必须保存。所以我实现了记忆模式。我需要知道如何同时序列化它们,以及如何在反序列化后找到memento源对象

我有baseMemento类和它的继承者

[System.Serializable]
public abstract class Memento {}
[System.Serializable]
public CharacterProgressMemento : Memento{/*public fields and realization*/}
[System.Serializable]
public AchievementMemento : Memento{/*public fields and realization*/}
可用于使用memento的界面

public interface ISavable
{ 
  Memento Save();
  Load(Memento state);
}

public Character: ISavable{
    public Memento Save() => CharacterProgressMemento(this);
    public void Load(Memento state)
    {
        if(!(state is CharacterProgressMemento)) return;
        /*apply state snapshot*/
    }

}
public abstract Achievement: ISavable{
    public Memento Save() => AchievementMemento (this);
    public virtual void Load(Memento state)
    {
        if(!(state is AchievementMemento)) return;
        /*apply state snapshot*/
    }

}
/*several similar classes which implements ISavable as Character*/
我认为这种实现负载的方法打破了Liskov替换原理。我说得对吗?但是我找不到更好的办法了

首先,我介绍如何使用这种iCartaker接口:

  public interface ICaretaker
    {
        void Add(ISavable savable);
        void Remove(ISavable savable);

        void Load();
        void Save();
    }
但不幸的是,有时我需要在可移动对象创建之前获得Memento

例如,我有一般字符和事件字符;要创建一个事件角色,我需要知道它是否是以前创建的

所有可保存的对象都以完全不同的方式序列化,从而生成不同的文件。但我希望将它们序列化为一个文件

如果看守人按照清单执行纪念品存储。我有两个问题:

  • 我无法管理当前状态
  • 反序列化后,不可能整理对象和具体的纪念品

  • 请帮帮我。谢谢:)

    如果您的问题最终是序列化/反序列化和继承,您可能应该发布用于执行此类序列化/反序列化的代码。修复可能必须在那里进行,而不是通过您向我们展示的类的设计。