C++ での並列継承に関する問題を解決しようとしています。これについて私が見つけた最も近い質問は、あるツリーのクラスが別のツリーのクラスのコンテナを持つ並列継承ツリーですが、私の問題には完全には答えません。
Model、Trainer、InstanceProcessor (IP) の 3 つのクラスで構成されるモデルがあります。これらのクラスには、それぞれモデル データ、トレーニング関数、およびモデル処理コードが含まれています。現在、このモデルには約 10 の異なるバージョンがあり、多くのコードが重複していますが、いくつかの違いがあり、何らかの形式の並列継承を作成しています。
Model - ModelA, ModelB, ModelC, ...
Trainer - TrainerA, TrainerB, TrainerC
IP - IPA, IPB, IPC
コードの本体では、Model* ポインターを使用して、解析された引数に応じて特定のモデルにアクセスします。
モデルとトレーナーの両方が IP の複数の短期間のインスタンスを必要とし、モデルはさらにトレーナーの永続的なインスタンスを必要とします。
私の現在の実装では、3 つの基本クラスといくつかの仮想関数を使用し、これらの基本クラスから継承する特定のクラスをモデル化します。これには、多くのキャストを使用する必要があります (たとえば、model.h の Trainer* トレーナーから、特定のニーズのために TrainerA に)。
これを実装するよりエレガントな方法があると思いますが(テンプレート/インターフェースを使用しますか?)、誰かが私を正しい方向に向けることができるかどうか疑問に思っていましたか? ありがとう!
編集:以下の回答からポイントを明確にするために、複雑さの1つは、私が欲しいという事実にあります。関数 basic_train() を持つトレーナー クラス:
Trainer::basicTraining() {
...
IP* ip = new IP(some args);
ip->doStuff();
...
}
ここで、使用するトレーナーのタイプに応じて、適切な IP が作成されます。その関数の残りの部分は、TrainerA から TrainerB インスタンスに変更されません。