【问题标题】:How to encapsulate property collection如何封装属性集合
【发布时间】: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


【解决方案1】:

您可以添加一个虚函数来设置基类 Aperture 中的属性,例如

虚空更新(向量) = 0;要么 虚空更新(...) = 0;

【讨论】:

  • 所有属性都有不同的类型。您建议使用vector<QVariant> 或任何其他“变体”类?
【解决方案2】:

嗯,决定关门的实体需要知道它可以关闭,它甚至应该考虑改变那个状态。以下是一些选项:

  • 让对象在通用的虚拟方法中自行决定(类似于Aperture::updateAperture::interactWithFireAperture::iteractWithPerson 或类似方法)。
  • 使用Visitor pattern,即创建virtual Aperture::visit,它将在访问者上调用适当的重载方法。这允许您仅为有意义的对象组合定义交互方法。
  • 使用“接口”,比如IClosable,在任何可以关闭的东西上,比如Door,并在适当的地方IClosable * closable = dynamic_cast<IClosable *>(apperture); if(closable) { /* consider whether it should be closed */ } 实际上你也可能会在访问者模式中使用这样的接口来减少必要的重载次数。

如果其中任何一种或任何组合对您有用,那么面向对象的方法是可行的。

【讨论】:

  • 感谢详细解答!我忘了说:我的标准是干净的代码 && 好的性能(建筑可以包含大量的对象)。所以我害怕使用缓慢的dynamic_cast 操作。通用的基方法是一种选择,但这可以在将来从基类中生成一个“blob”。因此,最好的选择将是某种访问者,例如Hierarchical 一个?
  • @Axilles: dynamic_cast 没那么慢。比虚拟方法调用慢一点,但也不慢。访客会更干净。如果您有子对象,分层访问者是合适的。
  • 好的,我会尝试分层访问者。目前我只看到一个严重的缺点 - 基本的访问者界面会很大,因为我有很多对象类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-17
相关资源
最近更新 更多