- C++相談室 part123 [無断転載禁止]©2ch.net
385 :デフォルトの名無しさん[]:2016/03/15(火) 18:46:33.79 ID:7F6lH4i+ - すみません、visitorパターンを使うとacceptを持つインターフェースクラス(ライブラリコード)が、
具象クラスであるvisitor(ユーザーコード)に依存してしまうという問題を解決したかったのですが、いまいち伝わらなかったみたいです。 >>378 型タグによるダウンキャストは、メンテの観点から採用できません... >>382 自分がなにを抽象化したいのか再考するきっかけになりました。 ありがとうございました。 結局visitorを内部のコンテナ型に依存するインターフェースクラスとすることで解決しました。 実際にはIVectorContainerとかIListContainerのような形にしました。 正確にはvalue_typeは決まってたのでテンプレートテンプレートパラメータを使いました。
|
- C++相談室 part123 [無断転載禁止]©2ch.net
387 :デフォルトの名無しさん[sage]:2016/03/15(火) 20:46:48.46 ID:7F6lH4i+ - >>386
ダウンキャストだとコンテナ型が増えるたびにif文を追加しなくてはならず、 しかも追加し忘れてもコンパイル時にエラーが出ないので…
|
- C++相談室 part123 [無断転載禁止]©2ch.net
389 :デフォルトの名無しさん[sage]:2016/03/15(火) 20:54:05.87 ID:7F6lH4i+ - >>388
いや、それはaccept側のオーバーライドで解決します これがvisitorパターンの一般的な実装かと思いますが、どこがわかりませんか?
|
- C++相談室 part123 [無断転載禁止]©2ch.net
391 :デフォルトの名無しさん[sage]:2016/03/15(火) 21:13:54.39 ID:7F6lH4i+ - >>390
家に帰ったら実装書きます
|
- C++相談室 part123 [無断転載禁止]©2ch.net
392 :デフォルトの名無しさん[sage]:2016/03/15(火) 22:59:29.47 ID:7F6lH4i+ - >>390
こういうことです https://ideone.com/JpA22R これダウンキャストで実装すると、acceptを一つにまとめてif文で一つずつキャストを試すわけですよね? その場合ConcreteXxxContainerがひとつ増えるとacceptを修正し忘れてもコンパイルが通ってしまって困ります
|
- C++相談室 part123 [無断転載禁止]©2ch.net
394 :デフォルトの名無しさん[sage]:2016/03/15(火) 23:01:00.99 ID:7F6lH4i+ - >>393
という風にしました
|