ダウンキャスト
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/05/10 00:54 UTC 版)
「Go (プログラミング言語)」の記事における「ダウンキャスト」の解説
Goはインターフェース型の値から、基底型の値(インターフェース型に変換される前の型の値)を動的に安全に得るダウンキャストの仕組みとして「型アサーション」と呼ばれる機能を備えている。 // Value の返値はどんな型でも構わないvar i interface{} = Value()/* i の基底型を string と仮定し、 実際にそうであれば s には変換結果が、 ok には true がセットされ、 そうでなければ s にはstring型の初期値(ゼロ値)が、 ok には false がセットされる。 以下の様に2つ目の返値を無視すると、i の基底型が string でなければ暗黙的にランタイムパニックとなる s := i.(string)*/if s, ok := i.(string); ok { fmt.Println ("文字列: ", s)} else { var kind string // 型switch switch i.(type) { case int: kind = "数値" default: kind = "その他" } fmt.Printf ("%s: %v\n", kind, i)} 標準パッケージのreflectを使うことで、対象の値型やその値などの詳細を得ることができる。
※この「ダウンキャスト」の解説は、「Go (プログラミング言語)」の解説の一部です。
「ダウンキャスト」を含む「Go (プログラミング言語)」の記事については、「Go (プログラミング言語)」の概要を参照ください。
ダウンキャスト
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/06/07 23:27 UTC 版)
ダウンキャストはアップキャストの逆で、基底クラスから派生クラスへの型変換、すなわちBaseのインスタンスをDerivedに変換する操作である。Baseのインスタンスは必ずしもDerivedのインスタンスとは限らないので、この変換は一般に安全ではなく、エラーが発生する可能性がある。そのため、多くの言語ではキャスト構文による明示的な変換の記述が必要である。通例、オブジェクト指向プログラミングではポリモーフィズムを使うべきであり、ダウンキャストおよびクロスキャストが必要になるということはプログラムの設計に問題があることを示唆している。 C++では、安全なダウンキャストのためにdynamic_castという特別な構文が用意されている。この構文では、実行時型情報を参照し、ポインタ間の変換が失敗すると結果としてnullptrが返る。参照間の変換が失敗するとstd::bad_cast例外がスローされる。dynamic_castを使用するためには、型に仮想関数テーブルが必要となる。つまり、基底クラスに少なくとも1つの仮想関数を持つ必要がある。確実に成功することが分かっているダウンキャストの場合はstatic_castで代用でき、これはdynamic_castよりも実行時コストが小さくなるが、失敗する可能性のある場合には使えない。単一継承の場合はダウンキャストにC言語形式のキャスト構文を使うこともできるが、多重継承の場合はダウンキャストにdynamic_castまたはstatic_castを使う必要があり、またどの基底クラスへのポインタにキャストするかによって結果アドレスが変化しうる。 Javaでは、ダウンキャストに失敗するとjava.lang.ClassCastException例外がスローされる。C++のdynamic_castに相当する機能は存在しないが、instanceof演算子で型情報を問い合わせることはできる。 C#では、ダウンキャストに失敗するとSystem.InvalidCastException例外がスローされる。また、as演算子が用意されており、変換が失敗した場合はnullが返る。またC# 7.0では、is演算子が拡張され、変換可能性をbool型で返すと同時に、末尾で宣言した変数に変換結果が格納される。as演算子is演算子共に、通常のキャスト演算子とは異なり、ユーザー定義変換は行われない。
※この「ダウンキャスト」の解説は、「型変換」の解説の一部です。
「ダウンキャスト」を含む「型変換」の記事については、「型変換」の概要を参照ください。
- ダウンキャストのページへのリンク