作成日 2009/2/15
最終更新日 2009/2/15

ダウンキャスト

 オブジェクト指向プログラミングをやっていると、スーパークラス型で宣言された変数をサブクラス型に変換したいと思うことがあります。この、「スーパークラス型からサブクラス型へ変換する」ことをダウンキャスト と呼びます(※1)。

-----
※1:逆に、「サブクラス型からスーパークラス型へ変換する」ことをアップキャストと言います。ただ、アップキャストはダウンキャストとは違い、絶対に成功するし、プログラミング上特別な操作も必要ないことが多いので、意識したことがないです。

1.ダウンキャストって
2.ダウンキャストを行う方法
3.参考文献


1.ダウンキャストって?

 ClassSuper、ClassSubの2つのクラスがあるとし、ClassSubはClassSuperを継承しているとしよう。
このとき、ClassSubのオブジェクトはClassSuperのクラス型で宣言された変数に代入できる(※1)んです。
 で、そのClassSuperクラス型の変数に代入してあるオブジェクト(※2)をもとのClassSubクラス型に代入する(変換する)ことをダウンキャストといいます。
 ダウンキャストは失敗することがある(継承関係に無いクラスのオブジェクトをキャストしようとした場合)ので、多くの言語では失敗したときには何らかの手段で失敗したことを知らせてくれます。 

■どのようなときにダウンキャストを使うか
 VB6.0、VBAではオブジェクトを動的配列(Collectionオブジェクト)に入れてしまうと、動的配列からオブジェクトを取得したときにはVariant型となりますから、本来の型にキャストさせる必要があります。
 また、ExcelライブラリやOfficeライブラリが提供するメソッドの戻り値がスーパークラス型だったりObject型となっている場合(※3)があり、このような時もキャストが必要です。
 まあ、キャストしなくても、コンパイルは通るかもしれませんが、メソッド候補一覧が出なくなったりコンパイル時のチェックがあまくなるのでお勧めできません。

 C++の場合は、どうだろうか。きっとあるということで。

 Javaの場合ですと、Java1.4以前の場合、Genericsがないので動的配列(java.util.Vector、java.util.ArrayList)や連想配列(java.util.HashMap)に入れたオブジェクトを配列の要素から取り出したときにキャストが必要となります。
 他には良く知らない。

-----
※1:一応、このことをアップキャストと言いますが、「アップキャスト」と言う単語を使ったことがないです。
アップキャストは全体に成功するのであえて言及する必要が無いからだと思います。
※2:正確には「ClassSuperのクラス型の変数から参照されているオブジェクト」。
※3:例えば、Excel.Sheets.Itemメソッド、 Office.CommandBarControls.Addメソッド、MSForms.Controls.Addメソッドなどです。
このページのトップへ

2.ダウンキャストを行う方法

 VB6.0・VBA、C++、Javaと言語別に説明します。

■VB6.0、VBAの場合
 VB6.0、VBAの場合は実は特別な構文は無いんです。
 目的のクラス型で宣言された変数に代入するだけで、勝手にキャストされます。

例:

標準モジュール(Module1)

Sub sample()

    Dim objCtl As Office.CommandBarControl
    Dim objCtl_pop As Office.CommandBarPopup
   
    Set objCtl = Application.CommandBars.Item(1).Controls.Item(1)
    Set objCtl_pop = objCtl 'キャスト

End Sub


もし、キャストに失敗した場合には実行時エラー(13)が発生します。

■C++の場合
 C++のページではないのでごく簡単に説明します。
 C形式のキャストでも可能ですが、dynamic_castを使用したほうがいいです。
 やり方は
  ClassSub* objSub = dynamic_cast<ClassSub*>(objSuper);
のような感じです。
 え、わからないって?詳しいことは「dynamic_cast」で検索をかけてください
 キャストに失敗した場合ですが、ポインタの場合はNULL(0?)が、参照の場合はstd::bad_cast例外がスローされます。

■Javaの場合
 Javaのページではないのでごく簡単に説明します。
C形式のキャストで記述します。
 やり方は、
  ClassSub objSub = (ClassSub)objSuper;
のような感じです。
 キャストに失敗した場合はjava.lang.ClassCastException例外がスローされます。

このページのトップへ

3.参考文献

 このページを作成する際に参考にしたページなどです。
 このページを見た人が参考になりそうなページも挙げました。

番号

リンク先の名称

リンク先の説明

リンクした日

1 型変換 - Wikipedia キャストについての説明があります。 2009/2/15
2 ジェネリックプログラミング - Wikipedia ジェネリクスについての説明があります 2009/2/15


Prev Up Next  Top
このページのトップへ

このページの利用によって発生した、いかなる損害について、このホームページの作成者は責任を負いません。
このページの間違いや嘘を見つけた方、このページに書いて欲しい情報がある方はメールをお願いします。

Microsoft 、Windows 、Visual Basic および Excel は米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。
ここではExcel® をエクセル、Visual Basic® for Applications をVBAと表記する場合があります。
Mac 、Mac OS 、Mac OS X は米国Apple Computer,Inc.の登録商標または商標です。
Sun、Sun Microsystems、サンのロゴマーク、Java、及び、Sun/Solaris/Java に関連するすべての商標およびロゴマークは米国 Sun Microsystems, Inc. の米国およびその他の国における商標または登録商標です。
その他、社名および商品名、システム名称などは、一般に各社の商標または登録商標です。

このホームページの作成者はこれらの会社とはいっさい関係がありません。