レッツは、私は次のコードを持っていると言う:C++ - 仮想コンストラクタに抽象クラスと代替は
class Block{
private:
data Data;
public:
data getData();
Block(arg3 Arg3, arg4 Arg4);
};
は実際に、ブロックを構築する方法はいくつかありますが、いつも同じメンバーデータおよび方法のgetDataと()唯一の違いはブロックの構築方法です。つまり、唯一の違いはコンストラクタです。
各ビルドプロセスに異なるクラスを書くのではなく、抽象クラスでgetDataを定義して宣言することで、コードの一部を分けることができますC++の仮想コンストラクタとして、別のビルドプロセスに対応する派生クラスごとに異なる記述をすることができます。
私はこの種のことについて多くの経験を持っていないので、仮想コンストラクタに代わるものがあるのだろうかと疑問に思いましたか?またはこの因数分解を行うための別の方法かもしれませんか?
PS:わたしはhttps://isocpp.org/wiki/faq/virtual-functions#virtual-ctorsを知っていますが、私がやりたいことに関してはかなり複雑なようですが、かなり一般的です...私は、コンストラクタ以外のすべてに対応するいくつかのクラスの間で共有コードを分解したいだけです。そして私は、新しいコンストラクタを実装するために、他のビルドプロセスに対応する新しいクラスを強制したいと思います。私の特定の状況について
詳細:
私はブロックを使用するアルゴリズムを持っており、それが彼らの構築プロセスに依存しないので、私は淡々ブロックを表現するためにテンプレート引数を使用してアルゴリズムを実装しましたその建設プロセスのしかし、私はいくつかのメソッドとそのコンストラクタを使用するので、必要なものと同じ種類のメソッドを持つためにブロックを表すクラスと、アルゴリズム実装のテンプレート引数として同じコンストラクタを使用するクラスが必要です。それで、私が実装したアルゴリズムで必要なメソッドとコンストラクタをブロックに持つように新しく実装されたクラスに強制的に抽象クラスを考えさせたのです。それは悪いデザインパターンであると私は立ち往生午前理由があるかもしれ...
EDITは、これまでのあなたの答えをいただき、ありがとうございます。私は少し一般的なことをしようとしたが、私は最後に与えた細部でさえ、実際にはあまりにも曖昧であると感じる。だからここに私がやって考えたものである:
// Matrix.hpp
template<typename GenericBlock> class Matrix{
std::vector<GenericBlock> blocks;
Matrix(arg1 Arg1, arg2 Arg2);
};
template<typename GenericBlock>
Matrix<GenericBlock>::Matrix(arg1 Arg1, arg2 Arg2){
// Do stuff
GenericBlock B(arg3 Arg3, arg4 Arg4);
B.getData();
}
ブロックが実際に圧縮されている次のように私は、Matrixクラスを持って、そしてそこにそれらを圧縮する方法はいくつか存在し、それがクラスMatrix
では何も変わりません。各圧縮技術のためのマトリックスクラスを書くのを避けるために、私はあなたが見たようにテンプレート引数を使用しました。だから私は各圧縮技術のためのクラスを書く必要がありますが、彼らはMatrix
と互換性があるために同じメソッドとコンストラクタの引数を持っている必要があります。
私は、各圧縮技術のためのクラスを書くために、抽象クラスを行うことを考えました。抽象クラスでは、すべての派生クラスがMatrix
と互換性があるように、私はMatrix
に必要なものすべてを書きます。今の私の問題は私の例です:私はgetData
を抽象クラスに定義することができます。なぜなら、常に同じであるからです(たとえば、Data
は行数になります)。クラスから派生した唯一のものは、コンストラクタです。
解決策の1つは、抽象クラスを持たず、保護されたコンストラクタを使用することです。しかし、新たに派生したクラスがコンストラクタを再実装することは強制しません。それが私が立ち往生している理由です。しかし、私はこの問題は他の人にも興味があるほど一般的だと思う。この場合、仮想コンストラクタの代替手段はありますか? (工場のパターンかもしれませんが、そのような共通の問題ではかなり複雑です)そうでない場合は、ブロックが異なる方法で構築できるマトリックスクラスを実装するより良い方法があります。同じデータといくつかの方法が共通していますか?
PS:私は、ランクの低い行列を生成する圧縮技術に興味があります。そのため、データは常に同じですが、ビルドプロセスではありません。
複数のコンストラクタだけではないのはなぜですか?私はあなたが複雑すぎるものと思われます。 –
実行時にブロック構築戦略を設定する場合は、なぜ抽象ファクトリを使用しないでください。 –
@JesperJuhlどういう意味ですか? –