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

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

abstract

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

[c] // 抽象クラス // 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");
}

}

[/c]

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

[c] var subClass = gameObject.AddComponent (); subClass.AbstractMethod (); subClass.Hoge ();

// ログ //subBaseClass : AbstractMethod //Hoge : BaseClass [/c]

virtual

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

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

}

}

public class SubBaseClass : BaseClass{

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

}

[/c]

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

// SubBaseClass : VirtualMethod [/c]

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

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