顧客のタイプに基づいてオブジェクトのファミリを作成する必要があります。仮想インターフェイスを定義する基本抽象クラス 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 ルールに違反しているためです。かなりの数のメソッドがすべての具体的な顧客クラスに適用できるわけではありませんが、使用しないでください。継承なしでこれを実装する方法。
何か案は