C++ C++;-设计不同的类,以便能够交换它们的规则
有一个设计问题我需要你的帮助 假设我需要设计一家服装店。在这家商店里有卖家和买家,每个人都在商店里登记了身份证 我们希望允许卖家以买家身份登录,反之亦然(使用他最初注册的相同ID)。 请记住,买方和卖方有不同的数据成员,而且为了使用函数Buy,我们只需要买方数据成员,而不是卖方数据成员 乍一看,考虑到卖家与买家的数据成员不同,我决定将这两个类设置为ShopPerson的派生类,即Person的派生类 我决定使用ShopPerson类的原因是允许买方和卖方使用包含公共函数的基类 我的问题是: “购买”功能应该是买方的唯一成员,但我如何才能将卖方视为买方?如果碰巧买方是卖方,那么他就没有这个功能 我上面的解决方案是,使用ShopPerson类来拥有一个共享/公共类也不好,因为Buy函数使用了一些数据成员,这些数据成员只专用于购买者,而ShopPerson对它们并不熟悉 我想到的唯一解决办法是放弃继承,但我不确定这是否正确。 我如何解决这个设计问题?有什么想法吗C++ C++;-设计不同的类,以便能够交换它们的规则,c++,C++,有一个设计问题我需要你的帮助 假设我需要设计一家服装店。在这家商店里有卖家和买家,每个人都在商店里登记了身份证 我们希望允许卖家以买家身份登录,反之亦然(使用他最初注册的相同ID)。 请记住,买方和卖方有不同的数据成员,而且为了使用函数Buy,我们只需要买方数据成员,而不是卖方数据成员 乍一看,考虑到卖家与买家的数据成员不同,我决定将这两个类设置为ShopPerson的派生类,即Person的派生类 我决定使用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*才能知道返回的指针,对吗?@syndicatorbbsellerPersonality()
我认为应该基于SellerData
和ShopPerson
创建一个Seller对象,members+1跟踪两个成员之间的持久买家/卖家数据transactions@KarthikT:我不会把ShopPerson
作为基类,除非Buyer
、Seller
和ShopPerson
都是句柄类(值语义)通过shared_ptr
共享一个公共数据(和实现原语)类。如果您想要对象标识,继承就不好了,因为这个原因:如果您为同一个人同时拥有Buyer
和Seller
,那么您现在为同一个人拥有两个ShopPerson
实例(违反了预期的对象标识)。@JoergB然后我看不到你的原始点,我假设你支持OPs点。此设计和我自己的原始设计都支持从买方
和卖方
访问购物者
,以明确切换一个到另一个的原因