ダウンキャストとは?

1. ダウンキャストの概要

ダウンキャスト(Downcasting) とは、基底クラス(親クラス)型のオブジェクトを、派生クラス(子クラス)型に変換することを指します。これにより、基底クラスにはない派生クラス固有のメソッドやプロパティにアクセスできるようになります。

しかし、キャストできない型への変換は実行時エラー(InvalidCastException)を引き起こす ため、適切なチェックが必要です。


2. 基本的なダウンキャストの方法

(1) is 演算子を使う方法(推奨)

is 演算子を使うことで、安全に型をチェックしながらダウンキャストを行えます。

class Enemy 
{
    public string Name { get; set; }

    public Enemy(string name) 
    { 
        Name = name; 
    }

    public void Attack()
    { 
        Console.WriteLine($"{Name} が攻撃した!"); 
    }
}

class Goblin : Enemy 
{
    public Goblin(string name) : base(name) { }

    public void Steal() 
    { 
        Console.WriteLine($"{Name} はアイテムを盗んだ!"); 
    }
}

class Program 
{
    static void Main() 
    {
        Enemy enemy = new Goblin("ゴブリンA");

        if (enemy is Goblin goblin) 
        {
            goblin.Steal(); // 安全に Goblin 型として扱える
        }
    }
}

is を使うメリット

  • 型チェックとキャストを同時に行える
  • キャストに失敗するリスクを排除できる

(2) as 演算子を使う方法(null チェック)

as 演算子を使うと、変換できない場合 null が返るため、null チェックが必要です。

Enemy enemy = new Goblin("ゴブリンB");

Goblin goblin = enemy as Goblin;

if (goblin != null) {
    goblin.Steal();
}

as を使うメリット・デメリット

✅ 例外が発生せず、安全にキャストできる。
null チェックを忘れると NullReferenceException の原因になる。


(3) (Goblin)enemy で直接キャストする方法(非推奨)

以下のように (Goblin)enemy で明示的にキャストできますが、キャストできない場合 例外(InvalidCastException) が発生します。

Enemy enemy = new Enemy("敵");
Goblin goblin = (Goblin)enemy; // InvalidCastException が発生!

直接キャストのリスク

  • キャストできない場合、実行時例外(InvalidCastException)になる
  • 事前に is*でチェックしたほうが安全

3. is を活用したダウンキャストの応用例

List<Enemy> に異なる型のオブジェクトを格納し、型ごとに処理を分ける

List<Enemy> enemies = new List<Enemy>() 
{
    new Goblin("ゴブリンA"),
    new Enemy("敵"),
    new Goblin("ゴブリンB")
};

foreach (Enemy enemy in enemies) 
{
    if (enemy is Goblin goblin) 
    {
        goblin.Steal(); // Goblin のみ Steal() を実行
    } else 
    {
        enemy.Attack();
    }
}

この方法を使うと、List<Enemy> に様々な派生クラスのオブジェクトを格納しつつ、型ごとに異なる処理を実行できる ようになります。


4. ダウンキャストの際の注意点

  1. キャスト可能か事前にチェックする (is 演算子を使う)
  2. 例外を防ぐために as** を使う場合は null チェックを忘れない**
  3. (派生クラス)enemy** の直接キャストは慎重に使う**
  4. インターフェイスを利用すれば型チェックを減らせる(SOLID原則のLiskovの置換原則を意識)

5. まとめ

方法安全性例外発生のリスクメリット
is を使う高いなし型チェックとキャストを同時にできる
as を使うnull チェックが必要例外が発生しない
(Goblin)enemy の直接キャスト低い例外発生の可能性大シンプルだがリスクあり

初心者には is 演算子を使う方法を推奨!

この技術資料をもとに、ダウンキャストを安全に活用してください!

C#

Posted by hidepon