2

設計上の問題があります。あなたの助けが必要です。

衣料品店をデザインする必要があるとします。この店には売り手と買い手がいて、それぞれがIDで店に登録されています。

売り手が買い手としてサインインできるようにし、その逆も可能にします(最初にサインアップしたのと同じIDを使用します)。

買い手と売り手は異なるデータメンバーを持っていることを覚えておいてください。また、関数Buyを使用するために必要なのは、売り手データメンバーではなく買い手データメンバーだけです。

一見したところ、売り手は買い手とは異なるデータメンバーを持っていることを考慮して、私はこれら2つのクラスをPersonから派生したShopPersonから派生したものとして設定することにしました。

ShopPersonクラスを使用することにした理由は、買い手と売り手に共通の関数を含む基本クラスを許可するためです(どちらも売買できるため)

私の問題は:

「購入」機能は購入者のメンバーのみである必要がありますが、販売者を購入者としてどのように扱うことができますか?偶然に買い手が売り手である場合、彼はこの機能を持ちません。

上記の私の解決策は、ShopPersonクラスを使用して共有/共通クラスを作成することも適切ではありません。これは、Buy関数が、バイヤー専用のデータメンバーを使用し、ShopPersonがそれらに精通していないためです。

私が考えている唯一の解決策は、継承を削除することですが、これが正しいかどうかはわかりません。この設計上の問題をどのように解決できますか?何か案は?

シンジケーター、ありがとうございました!

4

4 に答える 4

3

継承はあなたが必要とするものではないかもしれません。おそらく以下のようなものです。

class Buyer{
    ShopPerson* person;

    void Buy();
};


class Seller{
    ShopPerson* person;

    void Sell();
};

つまり、の中央リストがShopPersonありBuyerますSellerが、はトランザクションごとにインスタンス化されるシンクラスです。あなたは今継承を使うことができます

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

そして、このクラスから継承Buyerします。Seller

于 2013-01-31T08:13:26.373 に答える
3

すべての売り手が買い手であるかどうか、または一部の売り手だけが買い手になることができるかどうかによって少し異なります。最初のケースでは、それは簡単です。売り手買い手です。つまり、単純な継承を意味します。class Seller : public Buyer

2番目のケースでは、各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 に答える
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 に答える