2011-10-12 20 views
0

私は3つのクラス、ABを持っている、とBACあるCAです。これらのクラスは履歴を保持するように設計されているため、Aは、ヒストリをアーカイブするときに派生クラスが作成する仮想メソッドを提供します。void archive()と呼ばれます。多重継承の設計実装

突然、A,BCの情報を1つのクラスにまとめておく必要があります。私は最良のアプローチについてはわかりません。

私はBCから継承する新しいクラスDを作成し、diamond problemを避け、D::archive()は、単にB::archive()C::archive()を呼び出す持ってvirtual public Aに彼らの継承を変更することを考えました。

これは良いアプローチですか?または、複数の継承を使用しないように4つのクラスを再設計する必要がありますか?

+0

「今や、A、B、Cからの情報を単一のクラスに入れる必要があります - それが悪の根です。あなたは正確に何を達成しようとしていますか? –

+0

'B'と' C'の情報は非常に異なっており、3つのクラスすべての情報の必要性を想像も想像もしませんでした。しかし、もちろん、数年後、誰かが頭の中で「クール」なアイデアを持っていて、インターフェイスが機能しないので、私はそれを変更するための最良の方法を見つけようとしています。 – steveo225

+0

これを抽象的に理由づけるのは難しいです。一般的に、継承の代わりに構成を考えても構いませんが、具体的な内容に依存します。それが適切であれば、MIは良いかもしれません。 –

答えて

5

あなたのアプローチは標準です。 C++には多重継承がありますので、自由に使用してください。あなたはそれを正しく行う方法を知っているようです。

+0

それは聞こえない安堵です。できるだけ多重継承を避けようとする傾向があり、そのアプローチを正しく理解するにはしばらく時間がかかりましたので、すべてのコードを変更する前に忘れてしまったことがないようにしたいと思っていました。 – steveo225

+0

ところで、示唆されている他のアプローチも有効ですが、私はあなたが多形性の階層を必要としていると仮定しており、これをすべて変更する必要はありません。ゼロから始めて、代わりにインターフェイスのミックスイン(とコードの再利用のためのコンポジション)を検討するかもしれませんが、あなたが検討していることは大丈夫です。 –

5

構図を代わりに使用するのはどうですか?
など。継承の代わりにクラスとCclass D代理人を追加します。
組成物は、同じ結果を達成し、コードすることができる非常に簡単である(私見)

0

次の2人のメンバーBおよびC D ::アーカイブBを呼び出すことになる::アーカイブ及びC ::アーカイブを含む、A由来するDを有することができます

1

最終的なオーバーライドメソッドが持つコールチェーンの用心: B::method場合の通話A::methodC::method通話A::method、あなたはDでそれらを一緒に入れたときに、仮想を作り、D::methodコールの両方C::methodB::methodは、あなたが呼ばれるA::methodを取得する場合二度。

ベースがバーチャルにされている場合、そのような再エントランスは避けなければなりません。

+0

+1それは良い点です – steveo225