首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >继承类的备忘录

继承类的备忘录
EN

Software Engineering用户
提问于 2018-07-03 08:10:39
回答 1查看 239关注 0票数 0

我有以下问题。

我有一个管理图形元素的抽象类。我们叫它GraphicHost吧。就像这样:

代码语言:javascript
复制
class GraphicHost {
    class GraphicHostState {
        List<Sprite> sprites;
        List<Text> texts;
    }

    GraphicHostState state;
    public void setState(GraphicHostState s);
    public GraphicHostState getState();

    public void addSprite(Sprite s);
    public void addText(Text t);    
}

当我从一个场景移动到另一个场景时,我需要保存和恢复状态,因此需要状态子类。

现在,我有了一个使用OpenGL的具体实现。显然,除了基本的状态,我还需要着色器和纹理的处理等。

继承GraphicHostState并将它们添加到那里是一个很好的解决方案吗?比如:

代码语言:javascript
复制
...
class GLGraphicHostState {
    List<Integer> textures;
    List<Integer> shaders;
}
...

问题是图形主机对象必须是多态的。我有ScriptHost,它使用图形主机添加精灵/文本,它不应该知道具体的实现,但是应该能够保存和恢复它的状态。我可以覆盖getState/ setState,但是在setState中,我必须检查所提供的状态是否是GLGraphicHostState,这个检查看起来有点混乱,就像一个解决方法。

所以,通常,如果我有一个带有某种状态的抽象类,带有附加状态参数的子类,并且状态必须以多态方式保存/恢复(通过父GraphicHost接口),那么您建议如何做呢?

据我所知,Memento模式适合于必须保存和恢复状态的情况,但如何将其与前面提到的类层次结构相匹配呢?

EN

回答 1

Software Engineering用户

发布于 2018-07-03 09:46:33

我觉得你的做法在这里被误导了。因为我比C#更了解C#,我将使用前者来表示代码。但是,一些一般性的想法也适用于其他语言。

首先,这里不需要抽象类。所以使用一个接口:

代码语言:javascript
复制
interface IGraphicHost 
{
    GraphicHostState State { get; set; }
    void addSprite(Sprite s);
    void addText(Text t);    
}

接下来,我们需要处理不同的实现需要不同版本的GraphicHostState这一问题。我会选择两种方法中的一种来解决这个问题:

选项1:使用泛型

代码语言:javascript
复制
interface IGraphicHost<TState> where TState : IGraphicHostState
{
    TState State { get; set; };
    public void addSprite(Sprite s);
    public void addText(Text t);    
}

因此,现在IGraphicHost的每个实现都提供了自己的IGraphicHostState实现,例如:

代码语言:javascript
复制
class GLGraphicHost : IGraphicHost<GLGraphicHostState>
{
    ...
}

选项2:让类处理它自己的状态保存和加载

代码语言:javascript
复制
interface IGraphicHost
{
    void SaveState(Stream stateStream);
    void RestoreState(Stream stateStream);

    public void addSprite(Sprite s);
    public void addText(Text t);    
}

因此,现在,类被提供了一个流,它可以读取和写入自己的状态。这个状态是什么样子的,以及它如何加载和保存它,然后就变成了类的责任,根本不需要一个GraphicHostState

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/373510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档