クラスを継承する際に、メソッドを定義する際に色々と方法があります。 この際に、newを使う場合、またoverrideを使う場合があり、今ままでその辺りを特に意識しないで利用していたので、改めて勉強をしてみました。
Override と New
実際にコードを見てどのような挙動になるのか試してみます。 [c] // スーパークラス public class NewAndOverride : MonoBehaviour {
public void NewMethod()
{
Debug.LogError("NewAndOverride - NewMethod");
}
public virtual void OverrideMethod()
{
Debug.LogError("NewAndOverride - OverrideMethod");
}
}
//サブクラス public class SubNewAndOverride : newAndOverride{
public new void NewMethod()
{
Debug.LogError("SubNewAndOverride - NewMethod");
}
public override void OverrideMethod()
{
Debug.LogError("SubNewAndOverride - OverrideMethod");
}
} [/c]
まずは、スーパクラスとサブクラスを作成します。 それぞれ、メソッドを定義をして、newキーワードとvirtualキーワードをつけます。
[c]
NewAndOverride hoge = gameObject.AddComponent
SubNewAndOverride subHoge = gameObject.AddComponent
NewAndOverride sub2Hoge = gameObject.AddComponent
[/c]
Unity上で試しているのでAddComponentを利用しています。
結果は以下の様なログが吐き出されます。 [c] NewAndOverride - OverrideMethod NewAndOverride - NewMethod
SubNewAndOverride - OverrideMethod SubNewAndOverride - NewMethod
// newの場合は指定された型のメソッドが呼び出されます。 SubNewAndOverride - OverrideMethod NewAndOverride - NewMethod
[/c]
newとoverrideの違いは、インスタンスした時の方がスーパークラス・サブクラスで呼び出されるメソッドが違うことです。 ジェネリックを利用する場合に、スーパークラスで格納する場合などの場合、型の違いで上手く動かなくなる場合があります。
詳しくはこちらを参照に。 Override キーワードと New キーワードを使用する場合について Override キーワードと New キーワードによるバージョン管理 (C# プログラミング ガイド)