はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】抽象クラス・抽象メソッドについてかるくまとめてみた

はじめに

今回は抽象クラス・抽象メソッドの使い方と、アップキャスト・ダウンキャストについての記事になります。

抽象クラスポリモーフィズムと呼ばれるオブジェクト指向にとって重要な考え方に深い関係があるようです。

是非マスターをしちゃいましょう!

抽象メソッド・抽象クラス

抽象メソッドとは、実装を持たず、メソッドの意味(規約)だけを定義したメソッドです。
これは継承を前提としていて、派生クラス(サブクラス)でメソッドを実装します。
以下の例を参考にメソッド宣言時に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();     //このようにインスタンスを生成できなくする
    }
}

抽象プロパティ

プロパティにもabstractvirtual修飾子をつけることができます。

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の違い

抽象メソッドにおけるabstractvirtualの違いは以下の通りです。
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

さいごに

お疲れ様です。
特にアップキャストはオブジェクト指向において重要なものになります。
よければポリモーフィズムで検索してみてください!