0

我有一个简单的Store类,其中包含一个Inventory对象和一个CashRegister对象。为了销售商品,CashRegister 对象需要访问 Inventory 对象的方法;即,返回特定项目的价格、存储数量等的那些。让 CashRegister 对象访问 Inventory 对象的方法的最佳方法是什么?

谢谢你。

4

4 回答 4

3

CashRegister 对象需要访问 Inventory 对象的方法

为什么?CashRegister没有Inventory. _ 您可以CashRegister在剧院或电影院中拥有 a,而不仅仅是在Store. 您所说的这部分逻辑应该是商店的一部分。

class Store
{
   CashRegister register;
   Inventory I;
   void sellSomething(Item i)
   {
      //move logic inside the store
      //not in CashRegister
      int price = I.getPrice(i);
      register.addCash(price);
      I.removeItem(i);
   }
};
于 2012-05-24T09:18:31.903 回答
3

一种解决方案是在对象中存储对该Inventory对象CashRegister的引用,并在构造对象时给出该引用Store

class Inventory { /* ... */ };

class CashRegister
{
public:
    CashRegister(Inventory &inventory)
        : inventory_(inventory)
    { }

    // ....

private:
    Inventory &inventory_;
};

class Store
{
public:
    Store()
        : cashregister_(inventory_)
    { }

    // ....

private:
    Inventory inventory_;
    CashRegister cashregister_;
};
于 2012-05-24T09:20:11.150 回答
1
class Inventory {
  Currency price;
  uint64_t quantity;
  public:
    Currency get_price() { return price; }
    uint64_t get_quantity() { return quantity; }
};

然后您的收银机可以调用Inventory.

但实际上,您应该设置一个功能Inventory来保留或交付一定数量的物品(如果有的话)——收银机不需要知道有多少物品有库存,它只需要知道当前的需求是否可以满足。就此而言,我不确定是否Inventory需要知道物品的价格——如果周三下午有 10% 的折扣,那么仓库的业务是什么?

于 2012-05-24T09:19:20.563 回答
1

赋予对象职责,不要仅仅将它们用于聚集数据。

Inventory应该知道如何添加和删除Items 。可能需要进行交易。这个赋值是一个数据库的隐喻。

@Luchian 有正确的想法,但我会更进一步。

您希望Inventory(数据库)能够处理Transactions,在这种情况下,它专门用于使用收银机。

应该能够Item向.Inventory

看看Tell Don't AskWrite No Getters的想法。

于 2012-05-24T09:34:29.163 回答