项目 - 库存 - 关系,哪一个应该知道另一个?

时间:2013-05-02 06:32:01

标签: c++ class design-patterns

编制可包含6个项目的库存可能看起来像这样:

class Inventory {
    private:
        Item[6] m_items;
};

现在另一方面,项目看起来像这样:

class Item {
    private:
        Inventory* m_parent;
};

然而,显然两个班级都不能相互认识。 一个解决方案是一个共同的基类,但这两个类没有任何共同之处,它会导致更多问题,例如:我无法从m_parent->addItem(this);调用Item的构造函数。

2 个答案:

答案 0 :(得分:5)

项目在逻辑上是完整的。项目在一个根本没有库存概念的系统中值得建模。商品甚至可能不在库存中。它理论上甚至可能存在于多个库存中,具体取决于您正在建模的物品和库存类型。

另一方面,库存仅用于包含物品。它目前可能没有任何项目,但这本身就是库存的核心属性。

上述考虑使我得出结论,清单应该知道项目的概念以及它所拥有的特定项目。虽然项目应该被完全忽略,不仅仅是它们所处的库存,而是库存的概念

答案 1 :(得分:0)

我同意Ben的回答,但我想扩展一下,当库存需要知道项目的变化时,或者如果项目需要库存中的一些额外信息,这应该由回调来处理。回调可以通过多种方式实现(函数指针,接口,std :: function,signal / slot,...),但主要的是:该项目不知道库存。

示例:

class CallbackInterface {
    public:
        virtual void itemChanged() = 0;
};

class Item {
    public:
        Item(CallbackInterface* callback): m_callback(callback) { }
    private:
        CallbackInterface* m_callback;
};

class Inventory: public CallbackInterface {
    private:
        Item[6] m_items;
        virtual void itemChanged() {
            std::cout << "item has changed"; 
        }
};