私はビジターパターンとは何か、そしてそれをどのように使うかを知っています。この質問はこれと重複していません。
自分が書いた再利用可能なコードのほとんどを配置し、ほとんどのプロジェクトにリンクするライブラリがあります。
多くの場合、一部のクラスに機能を追加する必要がありますが、これらの新しい機能をライブラリに追加する必要はありません。実際の例を使用しましょう:
このライブラリには、、、およびによって継承されたクラスがありShape
ます。CircleShape
PolygonShape
CompositeShape
私は現在、これらをレンダリングする必要があるグラフィカルアプリケーションを開発していますが、使用するプロジェクトの一部はレンダリングを行わず、他のグラフィカルプロジェクトは使用する可能性があるため、コアクラスにShape
仮想関数を配置したくありませんさまざまなレンダリングエンジン(このプロジェクトではQtを使用していますが、ゲームではOpenGLを使用するため、関数にはさまざまな実装が必要になります)。render
Shape
Shape
render
もちろん、これを行う最も有名な方法は、Visitor Patternを使用することですが、これは私の心にいくつかの疑問を投げかけます。
私のように、どのライブラリのどのクラスも拡張する必要がありますShape
。ほとんどの公共図書館(それらのすべてについて)は、VisitorPatternをサポートしていません。なぜ?どして私がこんな事に?
ビジターパターンは、C++でダブルディスパッチをシミュレートする方法です。applyVisitor
これはC++でネイティブではなく、明示的に実装する必要があるため、クラスインターフェイスがより複雑になります。関数をクラスの関数と同じレベルにする必要はないと思います。これは抽象化を破るようなものです。
明示的にアップキャストShape
するdynamic_cast
方が費用がかかりますが、私にはそれはよりクリーンなソリューションのように見えます。
だから、私は何をすべきですか?すべてのライブラリクラスにダブルディスパッチを実装しますか?提供しているライブラリが私のものShape
ではなく、インターネット上にあるGPLライブラリが見つかった場合はどうなりますか?