2

有一个设计问题我需要你的帮助。

假设我需要设计一家服装店。在这家商店里有卖家和买家,每个人都用一个ID在商店里注册。

我们希望允许卖家以买家身份登录,反之亦然(使用他最初注册时使用的同一 ID)。

请记住,买方和卖方具有不同的数据成员,并且为了使用购买功能,我们需要的只是买方数据成员,而不是他的卖方数据成员。

乍一看,考虑到卖方与买方的数据成员不同,我决定将这两个类设置为派生自 Person 的 ShopPerson。

我决定拥有 ShopPerson 类的原因是允许买方和卖方包含通用功能的基类。(因为他们都可以买卖)

我的问题是:

“Buy”功能应该只是Buyer的成员,但是我怎么能把Seller当作Buyer呢?如果碰巧买方是卖方,那么他将没有此功能。

我上面的解决方案,使用 ShopPerson 类来拥有一个共享/公共类也不好,因为 Buy 函数使用了一些只供买方专用的数据成员,而 ShopPerson 不会熟悉它们。

我想到的唯一解决方案是放弃继承,但我不确定这是否正确。我该如何解决这个设计问题?有任何想法吗?

谢谢大家,辛迪加!

4

4 回答 4

3

这取决于每个卖家是否也是买家,或者是否只有一些卖家可以成为买家。在第一种情况下,很简单:卖家买家,这意味着简单的继承:class Seller : public Buyer

在第二种情况下,每个 ShopPerson 都应该有一个买家行为,我会考虑这样的事情:

struct BuyerBehavior
{
  void buy();
  string creditCardNumer(); 
  //and so on
};

class ShopPerson
{
public:
  BuyerBehavior* getBuyerBehavior();
};

class Seller : public ShopPerson
{
  // some seller-specific stuff here
};

卖家可以获取买家的行为——为了买东西,他必须有这种行为。

于 2013-01-31T08:33:01.837 回答
3

继承可能不是您所需要的。也许像下面这样。

class Buyer{
    ShopPerson* person;

    void Buy();
};


class Seller{
    ShopPerson* person;

    void Sell();
};

即,您有一个中央列表ShopPerson,但BuyerSeller是在逐个事务的基础上实例化的瘦类。你现在可以使用继承

class TransactionParticipant{
     ShopPerson *person;
     //Misc common functionality
};

并从这个类继承Buyer和。Seller

于 2013-01-31T08:13:26.373 回答
2

基于 Karthik T 的答案,您可以这样做,以便您可以在适当的类型之间进行转换:

class ShopPerson {
   // Common data
   // Optional data:
   unique_ptr<BuyerData> buyer_data; 
   unique_ptr<SellerData> seller_data; 

public:
   shared_ptr<Buyer> buyerPersonality(); // return null ptr, if no buyer data
   shared_ptr<Seller> sellerPersonality(); // return null ptr, if no seller data
};

class Buyer {
   shared_ptr<ShopPerson> person;
   BuyerData* buyer_data; // Points to person->buyer_data
public:
   void buy();
};

class Seller {
   shared_ptr<ShopPerson> person;
   SellerData* seller_data; // Points to person->seller_data
public:
   void sell();
};
于 2013-01-31T08:31:36.340 回答
1

看起来像适合装饰模式的东西。您有一些店员,在某些条件下扩展到卖家或买家。当然,装饰(扩展)是在运行时执行的,基于他们登录的角色。

于 2013-01-31T08:19:27.347 回答