UnityとゲームAIと将棋

Unity、Pythonを中心にゲーム開発やゲームAI開発の技術メモ等、たまに将棋も

【Unity】C#におけるアップキャストとダウンキャスト

Unityでゲームの開発をしている時に派生クラスで追加したフィールドに、取得した基底クラスのインスタンスを使ってアクセスしたいというケースがありました。 このケースを解決するためにアップキャストとダウンキャストについて調べていた際、以下の二つの参考になる記事を見つけました。

teratail.com

qiita.com

自分も最初は上の質問記事のような疑問を持っており、詳しいキャスト変換の仕組みを知りたいと思って調べていた時に見つけたのが下の解説記事です。

この記事中の解説で提示されている図が非常にわかりやすく、参考になりました。

自分の言葉でアレンジして解釈してみると

アップキャスト
→ 派生クラス型の変数を狭い窓(基底クラスの機能)を通して見ているだけで、変数が確保しているメモリ領域が破棄されるわけではない

ダウンキャスト
→ 基底クラス型の変数を広い窓(基底クラス+派生クラスの機能)を通して見るため、未整備のメモリにアクセスしてしまう可能性がある

といったところでしょうか。

つまり、アップキャストを行っても変数に対する見方が変わるだけで、もともと派生クラス型で変数を宣言した際に確保したメモリ領域は残っているため

派生クラス型で変数宣言 → アップキャスト → ダウンキャスト

という処理をしても、派生クラス型変数内のフィールドを参照できるということでした。