実際の訪問者パターンは、各クラスインターフェイスが一般的であることを前提としているため、オブジェクトの実際の種類を知っていれば、クラス外から操作を実行できます。これが出発点でない場合、訪問者は実際には適用されない可能性があります。
(この仮定が比較的弱いことに注意してください - 。例えば、各データメンバは、ゲッターを有する場合、それは些細な任意のconst動作のために達成される)
このパターンの焦点は異なっています。
これが出発点
ある場合は、操作数の増加をサポートする必要が
その後、何classs'コードに変更し、あなたがするために何をする必要がありますポインター(または参照)に適用された新しい操作を基本クラスにディスパッチします。
classic visitor CAD exampleを取る、これはより具体的にするには:
は、2D CADシステムの設計を考えてみましょう。その中心には、円、線、弧のような基本的な幾何学的形状を表すいくつかのタイプがあります。エンティティはレイヤーに整列され、タイプ階層の最上部には図面があります。これは単にレイヤーのリストといくつかの追加のプロパティです。
このタイプ階層の基本的な操作は、図面をシステムのネイティブファイル形式に保存することです。一見したところでは、階層内のすべての型にローカル保存メソッドを追加することは容認できるかもしれません。しかし、我々はまた、図面を他のファイル形式に保存したいと思っています。そして、より多くの異なるファイル形式に保存するためのメソッドを追加することで、比較的純粋な幾何学的データ構造がすぐに乱雑になります。
訪問者パターンの開始点は、例えば円形であり、具体的にはその半径(例えば、その半径)に対して十分なゲッターを有する。そうでない場合は、実際には問題があります(実際は、とにかく設計されたCADコードベースである可能性があります)。
しかし、この点からは、新しい操作を検討するとき、、タイプAをファイルに書き込み、2つのアプローチがあります
は、各クラスのwrite_to_file_type_a
等virtual
方法を実装し、各操作
のみ
後、唯一クラスごと
virtual
方法
accept_visitor
を実装します
あなたの質問の「実際にクラスそのものに触れないでください」とは、上のポイント2で、これが今後の訪問先を派遣するために必要なすべてであることを意味しますrsを正しいクラスに追加します。訪問者がゲッターを書くことを意味するわけではありません。
クラスが訪問するように設計されていない場合、このクラスのインターフェイスを変更する必要があります。新しい訪問者から訪問できるようにする必要があります。 –
@vlad私の答えは不明な点は何ですか?私は "クラスを変更せずに新しい機能を追加する"という意味を述べました。偽である他の解釈の存在は無関係ですか? – Yakk
多分私は間違って私の質問をしました。しかし、この質問では、http://programmers.stackexchange.com/questions/132403/should-i-use-friend-classes-in-c-to-allow-access-to-hidden-members訪問者は友人を置き換えるために使用されます。 –