0

私の質問は、プログラミングのテクニック、またはおそらくデザイン パターンに関するものです。base から派生したいくつかのクラスが、それらの間で何らかの相互作用を行う純粋仮想メソッドを含むとします。

たとえば、RectangleEllipseTriangleおよびLine- すべて a から派生したShape. そして、この抽象クラス にはShape、 が含まれていますvirtual bool Intersects(Shape* another) = 0

6 つの実装を作成する必要があるようです(ところで、この特定の例でより良い解決策はありますか?)。

現時点では、他の例はわかりません。

よく知られていることについて話しているのかもしれませんが、そのテクニックを説明する名前がいくつかあるとほぼ確信しています。しかし、インターネットで検索するために何を入力すればよいかさえわかりません。

ええと、そのようなことを実装する方法を教えてもらえますか(ヘルパーメソッドが必要か、それともおそらくですか?)それについていくつかのソース(アート、チュートリアルなど)を指摘できますかRTIIdynamic_cast

4

2 に答える 2

5

これはダブルディスパッチの教科書の例です。ウィキペディアの記事には、問題と解決策の適切な説明が記載されています。

http://en.wikipedia.org/wiki/Double_dispatch

私が正しく覚えていれば、AndreiAlexandescuの著書「ModernC++ Design」には、この問題に対する非常に洗練された解決策があります。

http://www.amazon.com/Modern-Design-Generic-Programming-Patterns/dp/0201704315

于 2011-08-22T17:17:50.477 に答える
1

単純な事実は、継承を間違って使用しているということです。Line、Box、Triangle のような継承の代わりに、一連の頂点で構成されるすべての形状を表す VertexShape と、数式によって記述されるすべての形状を表す FormulaShape を使用する必要があります。

継承は、クラスに存在しなければならないデータを単純に変更することによってモデル化できる関係をモデル化するために使用しないでください。たとえば、ポリゴンの構築に使用される頂点などです。

編集:いいえ、いいえ、いいえ。テンプレートを使用します。やむを得ない場合は専門化してください。それがそのためです。オーバーヘッドのない汎用アルゴリズムを提供します。私たちは90年代にこのようなものを発見しました。

于 2011-08-22T17:25:34.113 に答える