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
// ログ //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
// SubBaseClass : VirtualMethod [/c]
ただ、こちらの場合overrideのつけ忘れなど、意図しない動作をする恐れがありすし、ベースクラスで意味のない実装をしてしまう恐れがあります。 また、abstractで定義をしたメソッドは、サブクラスで必ず定義をしないと行けないので、記述ミスを防いだりすることもできます。
【参考】 抽象メソッド、抽象クラス - C# によるプログラミング入門 | ++C++; // 未確認飛行 C abstract 修飾子