[C#] class間のconversion

Dateというclassと、これをbaseにしたExtendedDateというclassがあるとすると、

Date dt;
ExtendedDate exdt = new ExtendedDate();
dt = exdt;

のようにbase となった親classの変数に子classを代入することは可能。実際にはどちらもstack上にあるのは参照なのでサイズ的には互換。ここでは暗黙のcastが実行される。親classへのcastは upcastと言う。
子classは親classを含むので、Dateの持つmethodやfieldはこの代入後でもすべて使用可能。このclassをさらにObject型の変数に代入できる。

System.Object obj;
obj = exdt;
Console.WriteLine(obj);

Objectはすべてのclassの親classとなっている。その次のWriteLineではexdtのToSring()が呼ばれる。
この逆の向きのcast、たとえば、objからDateへのdowncastは明示的にタイプを示す必要がある。cast出来ないときにはruntime errorが発生する。
エラーを発生させたくないときには、as 演算子を使う。

exdt = obj as ExtendedDate;

objがcastできればExtendedDate class になる。
castできないときにはnullとなる。
castできるかどうかの判断は is 演算子を使う。

obj is ExtendedDate
obj is Date

はobjがcastできるならtrueとなる。objがExtendedDate classのinstanceだとすると、base classであるDateにupcastできるので両方ともtrueの値を持つ。

広告
%d人のブロガーが「いいね」をつけました。