はじめに
今回は抽象クラス・抽象メソッドの使い方と、アップキャスト・ダウンキャストについての記事になります。
抽象クラスはポリモーフィズムと呼ばれるオブジェクト指向にとって重要な考え方に深い関係があるようです。
是非マスターをしちゃいましょう!
抽象メソッド・抽象クラス
抽象メソッドとは、実装を持たず、メソッドの意味(規約)だけを定義したメソッドです。
これは継承を前提としていて、派生クラス(サブクラス)でメソッドを実装します。
以下の例を参考にメソッド宣言時にabstract
またはvirtual
と表記し、派生クラスのメソッド宣言時にoverride
と表記します。
using UnityEngine; public class Enemy { public virtual void Attack() { Debug.Log("敵の攻撃"); } } public class Slime : Enemy { public override void Attack() { Debug.Log("スライムの攻撃"); } } public class Drakee : Enemy { public override void Attack() { Debug.Log("ドラキーの攻撃"); } }
抽象クラスは継承専用のクラスにするために、インスタンスを生成できなくなっているクラスのことです。
以下の例のようにクラス宣言時にabstract
と表記することで抽象クラスにできます。
using UnityEngine; public abstract class Enemy { public virtual void Attack() { Debug.Log("敵の攻撃"); } } public class Hoge : MonoBehaviour { private void Start() { Enemy enemy = new Enemy(); //このようにインスタンスを生成できなくする } }
抽象プロパティ
プロパティにもabstract
、virtual
修飾子をつけることができます。
using UnityEngine; public abstract class Enemy { protected int exp; public virtual int Exp => this.exp; public virtual void Attack() { Debug.Log("敵の攻撃"); } } public class Slime : Enemy { //サービスで経験値2倍 public override int Exp => this.exp * 2; public override void Attack() { Debug.Log("スライムの攻撃"); } }
abstractとvirtualの違い
抽象メソッドにおけるabstract
とvirtual
の違いは以下の通りです。
abstract
は実際の処理を記述しませんが、
virtual
はオーバーライドしなくてもエラーにならなく、実際の処理を記述することもできます。
アップキャスト・ダウンキャスト
基底クラスの変数に派生クラスの変数を渡すことをアップキャスト。
派生クラスの変数に基底クラスの変数を渡すことをダウンキャストと言います。
using UnityEngine; public class ParentClass { } public class ChildClass : ParentClass{ } public class Hoge : MonoBehaviour { private void Start() { //アップキャスト例 ChildClass childClass = new ChildClass(); ParentClass parentClass = childClass; //アップキャスト //ダウンキャスト例 ParentClass parentClass2 = new ParentClass(); ChildClass childClass2 = (ChildClass)parentClass2; //ダウンキャスト } }
ダウンキャストにはいくつか条件があるので、注意してください。
多態性 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C
さいごに
お疲れ様です。
特にアップキャストはオブジェクト指向において重要なものになります。
よければポリモーフィズム
で検索してみてください!