Niftyの過去ログ集 - ダウンキャストの正当性
ダウンキャストの正当性
ダウンキャストって悪いイメージがつきまとっていますが,これを使わずに C++ や Java など静的型付け言語でプログラムを組むことは不可能なんですよね.どういう場合にダウンキャストを使うのが正しいのだろう? と考えていたころの発言です.
00622/00624 BYI20012 まさーる ダウンキャストの正当性 (10) 96/09/02 15:58 コメント数:2 みなさん、こんにちは。 ダウンキャストですが、みなさんはどういう場合に使っていいと判断してます か? 一般に、ダウンキャストはなるべく避けなければならないものだとされていま す。でも、かといって使わずにすまされるものでもないですよね(なんで?って 聞かれてもすぐに答えられないところがつらいですが)。 そこで、ぜひみなさんの意見を聞かせてください。(Smalltalkのような型なし言 語を使っている方々のコメントも待ってます)。 僕自身は、次のように考えてます。 まず、あるプログラムでクラスを設計する場合、それぞれのクラスはある抽象 度のレベルを持っているんじゃないかと思います。クラス階層では スーパークラス <--------------> サブクラス 抽象度 高 <--------------> 抽象度 低 となりますが、互いに親子関係にないクラス同士でもどっちが抽象度が高いか低 いかはそのクラスの役割によって判断されるのではないかと思います。 ここで、クラスAをそのサブクラスBにダウンキャストしたクラスをCとしま す。 このとき、Cの抽象度がBと同じレベルかそれ以下ならダウンキャストが正当化 できるんじゃないかと思ってます。逆にいえば、CがAをBにダウンキャストした 段階でCの抽象度を下げているといってもいいかもしれません。 だから、Cの抽象度がもともとBのレベル以下に設計されていたならダウンキャ ストをしてもいいんじゃないかな? ということです。 なんかあいまいで漠然とした説明ですが、いかがでしょう? 96/09/02(月) まさーる(BYI20012)
抽象度という漠然とした概念が出ていますが,これは多分 Depedency Inversion Principle の影響でしょうか(オブジェクト指向の法則集参照).
00627/00627 BYI20012 まさーる RE^2:ダウンキャストの正当性 (10) 96/09/03 10:56 00624へのコメント επιστημη さん、こんにちは。 >「ダウンキャストは避けるべし」てのは「危険だから」ってのも理由の一つ >でしょう。ヘタすると猫をリンゴにキャストできてしまうからです。 >それともうひとつ、抽象ベースクラスから派生クラスへのキャストがコンパイル >エラーとなるてのもあります。 > >が、今や「危険だから」てのは理由にならないでしょうね。RTTIが使えますから。 ええ。ぼくもよくRTTIにはお世話になりました(といってもクラスライブラリが 用意しているものなんですけど)。 「ダウンキャストを避けるべし」というもう一つの理由は、ポリモルフィズムで 対応できるならそうしなさい、ということでしょうか。 一方無理にダウンキャストを使わないでポリモルフィズムで対応するとなると、 キャストする前のスーパークラスにサブクラスのインターフェイスを付け加える ことになりますよね。こうすることでスーパークラスの一般性がそこなわれるく らいなら、ダウンキャストを使え、ということかな。 なんかこっちの方がダウンキャストの正当性を理由付けするのにいいような気が してきました。#622の抽象度の発言は、ダウンキャストを使ったときこういう状 況になることが多い、という現象論のようです。 96/09/03(火) まさーる(BYI20012)
一応こんなふうにまとめましたが,はっきりとした理由はまだよくわからないです.多分 Meyer 先生の OOSC/2 を見ればその辺の話がもっと明確に書かれているのかもしれません.