【发布时间】:2013-01-06 19:00:01
【问题描述】:
我正在开发人员疏散模拟器。启动时,它将从 XML 文件中加载树状的建筑结构数据(地板/房间/墙壁等),加载人员的初始配置,读取用户定义的移动模型参数并开始模拟。例如。对于每个模型步骤中的每个人,我需要找到他附近的所有几何对象,并选择离建筑物最近的路径 - 尽可能快。
所以,我需要加载一个清晰的 OOP 方式来表示人们将移动的建筑物。 我坚持这个(只是例子):
class Aperture
{
...
public:
virtual QRectF extent() = 0;
virtual QString description() const = 0;
// other common for all apertures methods
private:
int m_srcRoomID;
int m_dstRoomID;
// other generic aperture properties
};
class Window: Aperture
{
...
public:
virtual void extent() override;
virtual QString description() override;
// other overrides
private:
EGlassType m_glassType;
bool m_bOpenable;
// other window-specific properties
};
// and other descendants: Door, CompositeDoor and so on
问题:我想将所有构建孔径存储在一个集合中作为指向抽象基础Aperture 的指针,并且只使用基础虚函数而不对派生孔径进行任何转换。
但是:在疏散期间,各种 Aperture 属性可能会发生变化,因此我需要以类型相关的方式修改它们。我不能使这个功能通用并将其放置到基类中:窗户没有关闭,防火门不怕火 - 但其他人可以,等等。可能有一种方法(例如设计模式)来动态存储/添加/删除这些属性?或者完全避免子类化,因为构建项目的完整层次结构非常复杂和笨重。
【问题讨论】:
-
我们需要更多关于程序应该做什么的信息。也许类层次结构不是这里的理想候选者。
-
@AlexandreC。完成,我更新了问题。对不起,如果我的英语不完美:/
标签: c++ design-patterns architecture c++11