首页 > 解决方案 > 如何在工厂方法设计模式中返回子类的实例?

问题描述

经过对工厂方法设计的一些指导,一些研究和尝试理解代码示例。有几件事我仍然没有掌握。

我正在尝试制作一个图层系统,其中每个图层一次可以加载一个场景并让该场景可以更改。

为此,我创建了:

开始

Layer头文件 ( Layer.h)

#pragma once 
#ifndef _LAYER
#define _LAYER

enum SceneType{
    Scene_None,
    Scene_Default,
    Scene_DLA,
    Scene_Boids
};

class Layer
{

public:
    void setup();
    void update();
    void draw();
    void changeScene(SceneType Type);
    static Layer *CreateScene(SceneType Type);

    Layer* scene;

private:
};

#endif

Layercpp 文件 ( Layer.cpp)

#include "DLA.h"
#include "Layer.h"

void Layer::setup() {

    // Start Scene
    scene = CreateScene(Scene_DLA);
    scene->setup(); // this causes the stack overflow
}

void Layer::update() {
    //scene->update();
}

void Layer::draw() {
    //scene->draw();
}

void Layer::changeScene(SceneType Type) {
    if (scene) delete scene;
    scene = CreateScene(Type);
}

Layer *Layer::CreateScene(SceneType Type)
{
    switch (Type)
    {
    case Scene_None:
    default:
        return nullptr;
    case Scene_DLA:
        return new DLA();
    }
}

以及场景类之一,DLA类头文件(DLA.h

#include "Layer.h"

class DLA: public Layer
{
public:
    DLA();
    void setup();
    void update();
    void draw();

private:
};

#endif

我已经删除了所有不重要或与我当前问题无关的内容(GUI 设置、模拟内容等)

我认为我现在的问题是当我希望它返回所需模拟的类型(在这种特定情况下)时,我的返回类型CreateScene()返回一个类型。LayerDLA

我读过

工厂方法是类的静态方法,它返回该类类型的对象。但与构造函数不同,它返回的实际对象可能是子类的实例。

那么如何让它返回一个子类的实例呢?因为截至目前,当我simulation->setup();在内部调用时,void Layer::setup()出现堆栈溢出错误

谢谢

标签: c++classoopfactory

解决方案


推荐阅读