2

顧客のタイプに基づいてオブジェクトのファミリを作成する必要があります。仮想インターフェイスを定義する基本抽象クラス ApplicationRulesFactory が 1 つあります。多くの具体的な顧客クラスは、このクラスから継承されます。

問題は、CustomerB という一部の顧客については、これらのオブジェクト Rule2 および Rule3 を使用しているアプリケーションの機能がその顧客のアプリケーション ユーザー インターフェイスから無効になっているため、オブジェクト Rule2 および Rule3 を使用しないことです。これらのオブジェクトをインスタンス化します。

単純化されたコードは次のとおりです。つまり、実際には ApplicationRulesFactory には、より多くの仮想メソッドと、それを継承するより具体的な顧客クラスがあります。

class ApplicationRulesFactory
{
  virtual Rule1*  GetRule1() = 0;
  virtual Rule2*  GetRule2() = 0;
  virtual Rule3*  GetRule3() = 0;   
  .....
};

class ACustomerRulesFactory : public ApplicationRulesFactory
{
   Rule1* GetRule1()
   {
     return new ACustomerRule1();
   }

  Rule2 * GetRule2()
  {
    return new ACustomerRule2();
  }  

 Rule3* GetRule3()
 {
   return new ACustomerRule3();
 }  
};  

class BCustomerRulesFactory : public ApplicationRulesFactory
{
    Rule1* GetRule1()
    {
      return new BCustomerRule1();
    }
    Rule2* GetRule2() // not needed
    {
      // what to return here ?
    }  
    Rule3* GetRule3() // not needed
    {
     // what to return here ?
    }
};

では、これを実装するにはどうすればよいですか:

1) 基本クラス ApplicationRulesFactory でいくつかのデフォルトの実装を返します。

class ApplicationRulesFactory
{
  virtual Rule1*  GetRule1() = 0;
  virtual Rule2*  GetRule2()  { return new Rule2DefaultImpl();}
  virtual Rule3*  GetRule3()  { return new Rule3DefaultIml();}   
};

しかし、Rule1、Rule2 から新しいクラス (Rule1DefaultImpl、Rule2DefaultImpl) を継承し、おそらくそれらを ApplicationRulesFactory のデフォルト実装のように返す目的で空の実装で作成するのは間違っているようです。

2)または具象クラスでデフォルトの実装を返し、これらのメソッドを基本クラスで純粋仮想のままにします

class BCustomerRulesFactory : public ApplicationRulesFactory
{
  Rule1* GetRule1()
  {
     return new BCustomerRule1();
  }

  Rule2* GetRule2() 
  {
    return new Rule2DefaultImpl();
  }

 Rule3* GetRule3() 
 {
    return new Rule3DefaultImpl();
 }
};

これらのソリューションは、必要ではありませんが、すべての具体的な顧客クラスでメソッドを再定義するのも非常に見苦しいようです。

3) また、このような継承を使用するべきではないのではないかと感じています。これは、継承に関する IS-A ルールに違反しているためです。かなりの数のメソッドがすべての具体的な顧客クラスに適用できるわけではありませんが、使用しないでください。継承なしでこれを実装する方法。

何か案は

4

3 に答える 3

4

ApplicationRulesFactory特定の種類の に対して意味をなさない場合Customers、それは適切な抽象化ではありません。

あなたのドメインknowsは理にかなっているのに、なぜRule2andを要求するのRule3でしょうか?

必要なことだけを知っているオブジェクトに、それRule1を与えるファクトリを使用させRule1ます。コンテキストを与えて、必要なファクトリを取得できるようにします。

于 2013-01-21T08:56:07.563 に答える
1

インターフェイスとファクトリを 1 つに混ぜているようです。確かに、インターフェイスはそれ自体がクラスである必要があり、基本クラスにデフォルトの動作があり、派生クラスにオーバーライドされた動作があるさまざまなルールがあり、ファクトリは正しいルールを実装する要求されたクラスへのポインターを返します。その場合のために。

しかし、あなたが達成しようとしていることを誤解しているかもしれません...

于 2013-01-21T08:47:06.117 に答える
0

ルールを使用できない場合は、基本クラスの実装から null ポインターを返すことをお勧めします (呼び出すことができないため、デフォルトの実装を気にしないことを除いて、オプション 1 とほとんど同じです)。

于 2013-01-21T08:45:32.077 に答える