かきスタンプ

福岡でフリーランスの物流系のエンジニアやってます。

C#:アップキャストとダウンキャストについて、サンプルソース付きで解説してみる

f:id:kakisoft:20180429085405p:plain

  • アップキャストは、常に安全に行える
  • ダウンキャストは、エラーが発生する事がある。  
     
※ 解説 ※
  • キャストは型を変更するだけで、中身が消える訳ではない。
    (アクセスできる範囲が変わるだけで、実態は存在している)
  • インスタンス作成時、メモリに領域が割り当てられる。
  • 子クラスのインスタンスは、親クラスのインスタンスより多くの領域を必用とする。
  • 親→子 とキャストした場合、子クラスが必要とする領域に、メモリが割り当てられていない状態となる。
    (そのため、エラーとして弾いている。)

 
 
以上を踏まえて、サンプルソースで説明。

//親クラス
class ParentClass { }
//子クラス
class ChildClass : ParentClass { }

private void MyButton01_Click()
{
    //===========================
    //      アップキャスト
    //===========================
    ParentClass parent01;
    ChildClass child01;

    //子クラスのインスタンスを生成
    child01 = new ChildClass();

    //子クラスのインスタンスを、親クラスに代入可能。
    parent01 = child01;


    //===========================
    //  ダウンキャスト(エラー)
    //===========================
    ParentClass parent02;
    ChildClass child02;

    //親クラスのインスタンスを生成
    parent02 = new ParentClass();

    //キャストできるかどうか確認(falseになります)
    if (parent02 is ChildClass)
    {
        //キャスト時にエラーが発生する
        child02 = (ChildClass)parent02;
    }

    //asを使えば キャストできない場合 nullが入る
    child02 = parent02 as ChildClass;


    //===========================
    //     ダウンキャスト
    //===========================
    ParentClass parent03;
    ChildClass child03;

    //親クラスのインスタンスを、子クラスで生成
    parent03 = new ChildClass();

    //ダウンキャスト可。
    child03 = (ChildClass)parent03;
}