1

2 つのサービス モードがあるとします。

ICommonInterface
-action1()

Mode1Service は ICommonInterface を継承します Mode2Service は
ICommonInterface を継承します

どちらも同様の機能を備えているため、共通のインターフェイス (ICommonInterface) があります。では、ICommonInterface の実装を提供する最善の方法は何でしょうか?

1) 構成を優先する場合、これは純粋に継承ではありません。共通のロジックは、別のヘルパー クラスになります。Mode1Service と Mode2Service は、共通の契約に従い、これらのヘルパーを呼び出して実際の実装を提供する必要があります。
- ヘルパー クラスは個別に使用できる必要はありません。

2) 継承により、両方のモード サービス クラスによって継承される共通のインターフェイスを継承する AbstractBaseModeService が作成されます。繰り返しますが、Mode1Service と Mode2Service には、共通のインターフェイスとは別に独自のインターフェイスがあります。

コードの再利用性を提供するだけですが、継承の方が優れていると思います。そのような場合の処理​​方法に関するアイデア。

4

2 に答える 2

0

まず最初に、

  1. オブジェクトを DRY に保つ必要があります (繰り返さないでください)。
  2. これらの実装は、共通の契約に従う必要があります。

個人的には、これらの共通のロジックを持ち、必要に応じて実装に独自の処理を実行させるインターフェースと抽象メソッドを進めることができると感じています。これがデフォルトの方法です。新しいオブジェクトを構成して、抽象クラスからヘルパー クラスまたはドメイン オブジェクトとしてプルすることも有効です。

Sabyが提供した例は、私が再現するものと同じです。

免責事項: (考えられたかもしれません)共通のインターフェイスを引き出すのは良くない
という理由だけMode1Serviceで、サービスがいくつかの構造に従うようにする目的でインターフェイスが導入されました。Mode2ServiceICommonInterface

于 2013-07-30T15:35:51.020 に答える
0

私はまた、次のようなものを好むでしょう:

class CCommonFunctions
{
   public:
    // Some utility Functions
    void set_somefunctions() 
    {
    }
};

class ICommonInterface
{
  public:
    virtual void action() = 0;
  protected:
    CCommonFunctions *p;
};

class Mode1Service: public ICommonInterface
{
   public: 
     void action() 
     {
        p->set_somefunctions();
        ... 
     }
};

class ServiceMaker
{
 public:
   void setService(ICommonInterface *icip)
   {
       m_ici = icip;
   }
   void makeAction()
   {
       m_ici ->action();
       ...
   }  
 private:
   ICommonInterface *m_ici;
};

int main()
{
  ServiceMaker mk;
  ICommonInterface *ici = new Mode1Service;

  mk.setService(ici);
  mk.makeAction();
  ...
  ...
}

うまくいくかどうか教えてください。これには Builder パターンも使用しました。

于 2013-07-30T06:52:30.933 に答える