のは私が改善する機会を持って、次のレガシーコードを持っているとしましょう:ベストプラクティス
class BaseInterfaceClass
{
#if(HAS_FEATURE_A == 1)
void doFeatureA1() = 0;
void doFeatureA2() = 0;
#endif
#if(HAS_FEATURE_B == 1)
void doFeatureB1() = 0;
void doFeatureB2() = 0;
void doFeatureB3() = 0;
#endif
#if(HAS_FEATURE_C == 1)
void doFeatureC1() = 0;
#endif
void doBaseFeature1() = 0;
void doBaseFeature2() = 0;
};
は、コンパイル時にインタフェースを定義する#ifdef
法を廃止するが方法です。新しいデザインのランタイムサイズを増やさずにつまり、HAS_FEATURE_A
でコンパイルされた派生クラスには、HAS_FEATURE_B
またはHAS_FEATURE_C
のコードは含まれません(コードはリンクされていますが、ランタイムチェックのために実際には使用されません)。
いくつかの注意事項
機能フラグは相互に排他的ではありません。それらの任意の組み合わせを定義することができます。
私が知覚しているように、各機能のサブクラスを定義し、複数の継承を使用して目的のインターフェイスをまとめても十分ではありません。派生クラスは、コンパイル時にフィーチャの任意の組み合わせを実装できなければならず、そのコンパイルに対して定義されていないフィーチャは含まれていなければならないことに注意してください。
コードを変更するための政治的コストは、すべての指令を取り除くことができなければならない、あるいはまったく実行しないといけないことを意味します。言い換えれば、基本クラスをもっときれいにするために定義を移動するだけでは不十分です。
任意のブルートフォースアプローチが非現実的であるような機能の組み合わせが十分にあります。私は何千というサブクラスを作るつもりはない。
私はテンプレートを知らないが、それが鍵かどうかを知りたい。
なぜ多重継承はありませんか?それは問題を非常にエレガントに解決するでしょう。 – Xeo
私はそう多くの厄介な方法で壊れていることが分かります。 –