Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9318

【C#】派生クラスにキャストで失敗

$
0
0

ベースクラスから派生クラスにキャストしようとしたときに、はまってしまったことをまとめておきます。

処理内容

メンバー変数を1つ保持しているベースクラス(CastBase.cs)と
1つ変数を追加した派生クラス(CastA.cs)を用意しました。

usingUnityEngine;/// <summary>/// ベースクラス/// </summary>publicclassCastBase{/// <summary>/// ベースクラスのメンバー変数/// </summary>publicintBaseMemberNum;}
/// <summary>/// 派生クラス/// </summary>publicclassCastA:CastBase{publicintAMemberNum;}

2つのクラスを使って、以下のような処理しました。(Unity上で動かしています。)
実行はTestMethod内のキャストで失敗し、null参照でエラーを吐いてしまいます。

usingUnityEngine;/// <summary>/// メインクラス/// </summary>publicclassMain:MonoBehaviour{voidStart(){varcastBase=newCastBase();//ベースクラスでインスタンス化varcastA=newCastBase();//ベースクラスでインスタンス化TestMethod(castBase,castA);}//ベースクラスを引数として受け渡すメソッドvoidTestMethod(CastBasecastBase,CastBasecastA){Debug.Log(castBase.BaseMemberNum);varcastedA=castAasCastA;//キャスト失敗。castedAにはnullが返ってきます。Debug.Log(castedA.BaseMemberNum);//null参照でエラーDebug.Log(castedA.AMemberNum);}}

修正方法はcastAをインスタンス化するときにベースクラスではなく、
CastA型でインスタンス化する必要があります。
CastA型で宣言をし、あらかじめCastAの領域を確保しないとキャストに失敗してしまうようです。

usingUnityEngine;/// <summary>/// メインクラス/// </summary>publicclassMain:MonoBehaviour{voidStart(){varcastBase=newCastBase();//ベースクラスでインスタンス化varcastA=newCastA();// CastA型でインスタンス化するTestMethod(castBase,castA);}voidTestMethod(CastBasecastBase,CastBasecastA){Debug.Log(castBase.BaseMemberNum);varcastedA=castAasCastA;Debug.Log(castedA.BaseMemberNum);Debug.Log(castedA.AMemberNum);}}

同じクラスに書かれると、なんてこともない問題ですが、実際に直面したのは、宣言とキャストする場所が離れてしまっていて、なかなか原因を発見することができませんでした。


Viewing all articles
Browse latest Browse all 9318

Latest Images

Trending Articles