ビジター デザイン パターンの accept メソッドをクラス階層のルートで実装できる可能性はありますか?
4 に答える
Java が基本クラスで 1 回だけ実装することを許可した場合accept
、まさにその事実が Visitor の目的全体を台無しにしてしまうと思います。
いわば、はい、しかし、適切な Visitor 実装には、基本クラスの実装に、基本クラスのどのサブクラスがthis
インスタンスであるかをチェックする if チェーンが必要です。他の人が指摘したように、ビジター パターンは、オブジェクトのランタイム タイプを何らかの方法で区別する必要がある複数のディスパッチのようなものを実現することです。つまり、「正しい」方法で Visitor を実装accept()
し、ディスパッチできる各サブクラスに を実装するかaccept()
、次のように階層のルートに大きなものを実装します。
public void accept(Visitor visitor) {
if (this instanceof Foo) {
doSomething();
} else if (this instanceof Bar) {
doSomethingElse();
} else ...
}
あまりきれいではありませんね。これは、Visitor と複数のディスパッチの要点である適切なポリモーフィック デザインを含む、あらゆる種類の設計原則に違反しているため、よく考えてみると、Visitor と呼ぶのは無理があると思います。
Java では、コンパイラがバインド先のメソッドを認識できないため、これは不可能です。(言語によっては、オブジェクトの実際のランタイム クラスに基づく動的メソッド バインディングがありますが、Java にはありません。)