【c#】抽象メソッド・クラス abstract 修飾子について

  • |
【c#】抽象メソッド・クラス abstract 修飾子について
   

C#には abstractなる、修飾子があります。
overrideやvirtualなどはよく利用しているのですが、このabstractに関してはイマイチ使い方がわからなかったので、今回調べてみました。
今回は、このabstractについてブログに書いていきたいと思います。

abstract

ネットで調べてみると、abstractは抽象メソッド・クラスを使う場合に利用をする修飾子です。
抽象という言葉、何を意味しているのかよくわからない言葉なのですが、この修飾子をつけたクラスなりメソッドは、実際には使うことがない定義をするだけの要素になります。
抽象クラスやメソッドは、継承をして利用することを目的としているのです。
ですので、抽象クラスはインスタンスできませんし、抽象メソッドはそれ自体継承(override)をして利用する必要があります。

// 抽象クラス
// BaseClassを継承して利用する。インスタンスできない。
public abstract class BaseClass : MonoBehaviour {

    // 抽象メソッド(定義だけ)
	public abstract void AbstractMethod ();

	public void Hoge()
	{
		Debug.LogError ("Hoge : BaseClass");
	}
}

public class SubBaseClass : BaseClass{

    // 抽象メソッドをoverrideして利用をする
	public override void AbstractMethod ()
	{
		Debug.LogError ("SubBaseClass : AbstractMethod");
	}
}


上記のような形でクラスを作成します。
基本クラスになる抽象クラスには、継承して利用する際に必要なメソッドやプロパティを定義をし、それを継承して利用をします。

var subClass = gameObject.AddComponent<SubBaseClass> ();
subClass.AbstractMethod ();
subClass.Hoge ();

// ログ
//subBaseClass : AbstractMethod
//Hoge : BaseClass

virtual

この場合、virtualでも良いのではないか思う場合もあります。
こんな感じです。
public class BaseClass : MonoBehaviour {

	public virtual void VirtualMethod ()
	{
		Debug.LogError ("BaseClass : VirtualMethod");

	}
}

public class SubBaseClass : BaseClass{

	public override void VirtualMethod ()
	{
		Debug.LogError ("SubBaseClass : VirtualMethod");
	}
}


サブクラスをインスタンスをして呼び出すと、サブクラスでoverrideをしたメソッドが呼ばれます。
var subClass = gameObject.AddComponent<SubBaseClass> ();
subClass.VirtualMethod ();

// SubBaseClass : VirtualMethod

ただ、こちらの場合overrideのつけ忘れなど、意図しない動作をする恐れがありすし、ベースクラスで意味のない実装をしてしまう恐れがあります。
また、abstractで定義をしたメソッドは、サブクラスで必ず定義をしないと行けないので、記述ミスを防いだりすることもできます。

【参考】
抽象メソッド、抽象クラス – C# によるプログラミング入門 | ++C++; // 未確認飛行 C
abstract 修飾子

Related Posts Plugin for WordPress, Blogger...