【C#】newとoverrideの違い

クラスを継承する際に、メソッドを定義する際に色々と方法があります。 この際に、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 (); hoge.OverrideMethod (); hoge.NewMethod ();

SubNewAndOverride subHoge = gameObject.AddComponent (); subHoge.OverrideMethod (); subHoge.NewMethod ();

NewAndOverride sub2Hoge = gameObject.AddComponent (); sub2Hoge.OverrideMethod (); sub2Hoge.NewMethod ();

[/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# プログラミング ガイド)