1

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

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

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

class Item {
    private:
        Inventory* m_parent;
};

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

4

2 回答 2

5

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

另一方面,库存只是为了包含物品而存在。它目前可能没有任何物品,但这本身就是库存的核心属性。

上述考虑使我得出结论,库存应该了解物品的概念以及它所拥有的特定物品。虽然项目的实施不仅要完全忽略它们所在的库存,还要完全忽略库存的概念

于 2013-05-02T06:39:10.970 回答
0

我同意 Ben 的回答,但我想扩展这一点,当库存需要了解物品的变化或物品需要库存中的一些额外信息时,这应该由回调处理。回调可以通过多种方式实现(函数指针、接口、std::function、信号/槽……),但主要的是:物品不知道库存。

例子:

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"; 
        }
};    
于 2013-05-02T07:05:40.197 回答