C++ C++;-设计不同的类,以便能够交换它们的规则

C++ C++;-设计不同的类,以便能够交换它们的规则,c++,C++,有一个设计问题我需要你的帮助 假设我需要设计一家服装店。在这家商店里有卖家和买家,每个人都在商店里登记了身份证 我们希望允许卖家以买家身份登录,反之亦然(使用他最初注册的相同ID)。 请记住,买方和卖方有不同的数据成员,而且为了使用函数Buy,我们只需要买方数据成员,而不是卖方数据成员 乍一看,考虑到卖家与买家的数据成员不同,我决定将这两个类设置为ShopPerson的派生类,即Person的派生类 我决定使用ShopPerson类的原因是允许买方和卖方使用包含公共函数的基类 我的问题是: “购

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

假设我需要设计一家服装店。在这家商店里有卖家和买家,每个人都在商店里登记了身份证

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

请记住,买方和卖方有不同的数据成员,而且为了使用函数Buy,我们只需要买方数据成员,而不是卖方数据成员

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

我决定使用ShopPerson类的原因是允许买方和卖方使用包含公共函数的基类

我的问题是:

“购买”功能应该是买方的唯一成员,但我如何才能将卖方视为买方?如果碰巧买方是卖方,那么他就没有这个功能

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

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


谢谢大家,辛迪加

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

class Buyer{
    ShopPerson* person;

    void Buy();
};


class Seller{
    ShopPerson* person;

    void Sell();
};
i、 e您有一个
ShopPerson
的中心列表,但是
买方
卖方
是基于事务的精简类。您现在可以使用继承

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

并从这个类继承
买方
卖方

看起来像是适合这个类的东西。你有一些店员,在某些条件下,他们可以扩展到卖家或买家。当然,装饰(扩展)是在运行时根据用户登录时的角色执行的。

基于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();
};
class-ShopPerson{
//公共数据
//可选数据:
唯一的买方数据;
唯一的卖方数据;
公众:
shared_ptr buyerPersonality();//如果没有买家数据,则返回null ptr
shared_ptr sellerPersonality();//如果没有卖方数据,则返回null ptr
};
类买家{
共享ptr人员;
买方数据*买方数据;//指向人员->买方数据
公众:
无效购买();
};
班主任{
共享ptr人员;
SellerData*卖方数据;//指向个人->卖方数据
公众:
无效销售();
};
这取决于是否每个卖家都是买家,或者是否只有一些卖家可以成为买家。在第一种情况下,很简单:卖方是买方,这意味着简单的继承:
类卖方:公共买方

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

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

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

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

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

但是卖家怎么能成为买家呢?是的。考虑到一个函数需要作为一个参数,仅仅是一个购物者,让他销售和购买,SeaWoW::“ArneMertz Seller和买方将只存在于那个交易中。”下一笔交易,如果愿意,同一个购物者将是卖家或买家。@SyndicatorBB id将链接到
购物者
,如果他们想以
买家
身份登录,则实例化a
买家
,否则a
卖家
。因此,卖家和买家都不需要dm“ShopPerson*person;”如果他们继承自TransactionParticipant,对吗?这种模式也被称为“适配器”吗?装饰器模式不是用于接口保持不变但行为改变的情况吗?这里还有一个接口更改。@KarthikT不,装饰器是关于添加行为,而不是更改行为,因为装饰器在自己的实现之前或之后将调用路由到装饰对象。装饰器也可以通过接口中的其他方法提供其他行为。如果您的TransactionParticipant本身确实是一个购物者,那么这将有点类似于您自己的建议。看起来不错,只有一件事。关于函数“shared_ptr sellerPersonality()”—您必须有一个数据成员Seller*才能知道返回的指针,对吗?@syndicatorbb
sellerPersonality()
我认为应该基于
SellerData
ShopPerson
创建一个Seller对象,members+1跟踪两个成员之间的持久买家/卖家数据transactions@KarthikT:我不会把
ShopPerson
作为基类,除非
Buyer
Seller
ShopPerson
都是句柄类(值语义)通过
shared_ptr
共享一个公共数据(和实现原语)类。如果您想要对象标识,继承就不好了,因为这个原因:如果您为同一个人同时拥有
Buyer
Seller
,那么您现在为同一个人拥有两个
ShopPerson
实例(违反了预期的对象标识)。@JoergB然后我看不到你的原始点,我假设你支持OPs点。此设计和我自己的原始设计都支持从
买方
卖方
访问
购物者
,以明确切换一个到另一个的原因