- ツリー構造にvisitorパターンを適用したい.
- クラス図はこんな感じ.問題を単純化してあるのでかなりシンプル
[Node] [Visitor]
△ +accept(Visitor) +visit(Node)
----|------ +visit(SNode)
| | +visit(INode)
[SNode] [INode]
- 左の3種類のノードに対して,それぞれに対応するVisitor.visit(...)メソッドが右にある.
- さらにVisitor.visit(...)はNode.accept(Visitor)から呼び出される.Visitorパターンです.
- どのノードからaccept(Visitor)を呼び出しても,visit(Node)が呼ばれてしまう.
Visitor visitor = new Visitor();
SNode snode = new SNode("aaa");
snode.accept(visitor); // Visitor.visit(Node)が呼ばれてしまう.Visitor.visit(SNode)が期待.
- どうやってもノードに対応するvisit(...)メソッドが呼ばれない.
- VisitorTestクラスをJUnitテスト実行してください
- 俺のexcpectとactualがきちんと書いています.
- 全テストケースが正しく動作すればgod
-
accept(Visitor)メソッドをNodeクラスから継承しているのが悪そう.
- 継承やめてaccept(Visitor)メソッドをSNodeとINodeにばらまけば動く.
- でもNodeの種類が増えると地獄なので避けたい.
-
JDTの実装見るとこのやり方で正しく動いているっぽいけど,何かが足りない???
- acceptをぶちまけるのが正解.
- JDTではaccept0(Visitor)がNodeの抽象メソッドとして定義されていて,全継承クラスで実装されている.
- Javaでは親クラス内でのthisの型解決が,どうあがいても子と見なされないっぽい.