Long-Slow-Distance

Programming Notes with Unity

メニュー

[C#] オブジェクトが特定のクラスを継承しているかをチェックして処理分けする

ある基底クラスを継承して派生クラスを複数作成した時に、
基底クラスベースでそれらのオブジェクトを扱う事がよくあるが、途中で継承した派生クラス別で処理を分けたい場合。

以下、サンプル。

public class CharaBase {}

public class Human : CharaBase {}
public class Enemy : CharaBase {}

public class Player : Human {}	// Humanを継承するが, 大元はCharaBase
public class Monster : Enemy {}	// Enemyを継承するが, 大元はCharaBase

public class DeriveCheck : MonoBehaviour
{
	// Awake
	void Awake()
	{
		checkDerive( m_Monster );
	}

	// CharaBaseで受け取り, 途中の派生クラス別に処理を分ける
	private void		checkDerive( CharaBase chara_base )
	{
		if( chara_base.GetType().IsSubclassOf(typeof(Human)) ){
			Debug.Log( "Humanクラス継承のインスタンスです" );
		}else if( chara_base.GetType().IsSubclassOf(typeof(Enemy)) ){
			Debug.Log( "Enemyクラス継承のインスタンスです" );
		}else{
			Debug.Log( "それ以外のクラス継承のインスタンスです" );
		}
	}

	// member
	public Player	m_Player	= new Player();
	public Monster	m_Monster	= new Monster();
}

GetType().IsSubclassOf(typeof(派生クラスの型)) で判別出来る。

あくまで「派生途中のクラス」なので、派生の末端クラスを指定しても通らないので注意。
(末端の場合は直接 GetType() == typeof(型) で見る)

こういった型で処理分けというのはどちらかというと強引な方法なので、正直多用はオススメしない。
このサンプルの場合だとベースクラスに1つタイプ用の変数を持たせて、
そのタイプをきっちり設定して処理分けするのが望ましい。

ツール作成などアプリケーションの表に出ない部分でのシステム的なコーディングをする際は
これを知っておくと便利だろう。

参考:
http://smdn.jp/programming/netfx/tips/check_type_isassignablefrom_issubclassof/
http://gushwell.ldblog.jp/archives/52042375.html

関連記事