ダブルディスパッチ
二重分布とは何ですか?
オブジェクト指向のプログラミングについて話すとき、私たちはしばしばオブジェクト指向の「多型」について話します。その中には、「親クラスの参照が子クラスオブジェクトを指し示す」という多型についてのことわざがしばしばあります。
この親クラスの参照は、サブクラスオブジェクトへのポイントが次のように書かれています。
動物動物= new Dog(); animal.bark();
一般的に使用される別のフォームはです
パブリッククラスキーパー{public void says(animal a){system.out.println( "Animal Says"); } public void says(dog dog){system.out.println( "dog says"); }}動物動物= new Animal();動物犬= new Dog();キーパーキーパー= new Keeper(); Keeper.say(動物); keep.say(dog);上記の飼育者が2回発言すると、どのコンテンツが出力されますか? 2つの異なる方法が呼び出されますか?
実際、これらの2つの呼び出し中、この方法は(動物A)と呼ばれると言います。これらの内容は編集期間に見つけることができるため、これはJavaの静的分布です。
上の図から、2つの呼び出しによって生成されたバイテコードが発言(動物A)メソッドを指していることがわかります。この方法は実行時に直接実行され、対応するコンテンツは出力です。
対応する動物がなぜ犬クラスの方法を呼び出すことになっているのですか?これは、実行時に特定のメソッド受信者のタイプを決定し、実行することです。これは動的分布と呼ばれ、実行時に特定の方法を決定し、オブジェクト指向の多型を実装します。
急送
配布とは、実行するメソッドを最終決定するプロセスを指します。
Javaなどの静的言語の場合、それらはすべて単一の配信(単一のディスパッチ)によって実行されます。
たとえば、コードの行
dog.eat(new Bone())
選択されるEATメソッドの最終実行は、特定のタイプの犬に従って対応するメソッドのみを選択し、合格したパラメーターは対応する方法の選択に影響することはできません。これは単一の派遣です
実際のパラメーターを渡すには、ボーンが本当に役割を果たすためにここにいます。ダブルディスパッチまたは複数のディスパッチを使用する必要があります
つまり、最終決定は、メソッドの受信機だけでなく、パラメータータイプでもあります。
ビジターモード
GOFの設計モードでは、Visitor Modeはダブルディスパッチを使用して、実際のオブジェクトを呼び出す目的を達成します。
訪問者モードの場合、最も一般的な例はツリートラバーサルです。たとえば、ノードと葉を処理する方法には違いがあります。これは、さまざまな要素を実装し、異なるコンテンツを実行するために、訪問者の二重分布を通じて行われます。
コードは次のようになります:
node.accept(new Concreatevisitor()); leaf.accept(new Concreatevisitor());
ノードの受け入れ方法は、実際のタイプを再び訪問者に戻します
public void Accept(Visitor V){v.visit(this); }この時点で、訪問者では、実際のタイプに応じて特定の方法を呼び出すことができ、ノードと葉に対応する方法に似た方法があります。
パブリックボイド訪問(ノードN);パブリックボイド訪問(Leaf L);
訪問者を要約すると、通常、訪問者インターフェイスが含まれます。 Visitor Interfaceには、アクセスする各要素オブジェクトの処理ロジックが含まれています。各要素の特定の実装では、正確なロジックコールを実装するために、独自のタイプを訪問者に戻します。
Tomcatのアプリケーション
訪問者はTomcatでも使用され、通常はEL式を解析します。
たとえば、org.apache.el.parser.node
このクラスには、Accept(Nodevisitor Visitor)メソッドが含まれています
多くの実際のノードタイプがありますが、実際の呼び出しのこの時点で、それは渡されます
public void Accept(nodevisitor Visitor)スロー例外{visitor.visit(this);実際のタイプを訪問者に戻すと、パラメーターも決定的な役割を果たすことができるように、特定の方法がバイザーで呼び出されます。
public void Visit(ノードノード)Elexception {if(node instanceof astfunction){astfunction funcnode =(astfunction)node;方法m = null; } else if(xxx){}ここでは、複数の訪問方法が宣言され、上記の訪問(これ)はターゲットメソッドに直接配置されます。
上記は、パターンの形を通してデュアル分布を実現するためのJavaと訪問者モデルのさまざまな分布です。私はそれが誰にでも役立つことを願っています。ご不明な点がございましたら、メッセージを残してください。編集者は、すべての人に時間内に返信します!