【Unityメモ】継承のあれこれ
どうもマカロンです。
新しい取り組みとして技術的な部分を未来の自分のためにnoteにまとめていきたいと思います。
なので記事自体はすごく短くなりますが、逆に単的に一つのものについて書いていくので「これってどうだっけ?」みたいなピンポイントで思い出したいときとかの需要はあるかもです。
また僕が勉強が苦手なのもあって、できるだけわかりやすく丁寧に(書こうとは思っているので初心者の方のお役には立てるかもです。
概要
今回は継承のあれこれについて書いていきます。
この記事では主にabstractとvirtualについて触れていくので
それを理解するうえで必要な用語の説明を先に書いておきます。
参考記事
抽象クラスと抽象メソッド
・抽象クラス
abstractをつけたクラス
・抽象メソッド
抽象クラスを継承したサブクラスで共通で使えるメソッド
暗黙的にvirtual修飾子を持つ
abstractとvirtualの使い方
まずこの二つの特徴の違いについてまとめます。
abstractの特徴
・実体をもたない(ルールだけを持つ)
・インスタンス化できない(オブジェクトにアタッチできない)
・抽象メソッドで使用する場合、サブクラスはそのメソッドを含まなくてはならない
virtualの特徴
・実体を有無はこっちで設定可能(ルールや初期基底)
・インスタンス化可能
・抽象メソッドで使用する場合、サブクラスはそのメソッドを含んでも含まなくてもいい
言葉だけだとイメージがつかみずらいので(僕が)
コードを書いていきましょう!
abstractとvirtualの使用例
・抽象クラス
using UnityEngine;
public abstract class Abstract : MonoBehaviour
{
protected abstract void Nakigoe();//抽象メソッド
protected virtual void Amimal() { Debug.Log("アニマルクラスやで"); }
}
まず、Abstractという抽象クラスを作成しその中にabstractとvirtualのメソッドを追加します。
ここでさっそく違いがあってabstractは実体を持てないので宣言のみになっていますが、virtualは実体を持てるのでDebug.Logを入れています。
・サブクラス(ヒヨコ)
using UnityEngine;
public class Hiyoko : Abstract
{
void Start()
{
Amimal();
Nakigoe();
}
protected override void Nakigoe()
{
Debug.Log("ぴよぴよ");
}
protected override void Amimal() { Debug.Log("ヒヨコやで"); }
}
こちらは実際にオブジェクトにアタッチするスクリプトです。
abstractのメソッドNakigoeとvirtualのメソッドAmimalを含む
ヒヨコクラスを作成しました。
比較するためにもう一つスクリプトを作ります。
・サブクラス(ネコ)
using UnityEngine;
public class Neko : Abstract
{
void Start()
{
Amimal();
Nakigoe();
}
protected override void Nakigoe()
{
Debug.Log("にゃーにゃー");
}
}
今度はabstractのメソッドのみのネコクラスを作成しました。
virtualを含まないで実行できるかを確認するためです。
では適当なオブジェクトにアタッチして実行してみましょう!
実行結果
この結果からvirtualを指定してないネコクラスは抽象クラスで宣言した
"アニマルクラスやで"が呼ばれることがわかりました。
abstractのクラスも正常に呼ばれていることが確認できました。
インターフェースと抽象クラスの違い
こちらの記事がわかりやすかったです。
簡単に説明すると抽象クラスはカテゴリーの中の種類などで親子関係のクラスを作る時に有効で多重定義ができない。
例 : カテゴリー(動物) 種類(犬、猫、ヒヨコ)
インターフェースは親で定義したモノが出来ることを子が持つみたいなときに有効で多重定義可能。
例 : モノ(改札) 出来ること(電子決済、切符、回数券、往復券)
ゲームを作るにはやはりお金がないとできることが限られてしまいます。なのでよろしければどうか支援してくださるとうれしいです