はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】ovverrideとnewの挙動の違い(アップキャストしたときに違います)

はじめに

overridenewの二つのキーワードの挙動の違いについて書いていきたいと思います。

詳細を知りたい方は公式ドキュメントを見てみてください↓
docs.microsoft.com

挙動の違い

overridenewキーワードは派生クラスをアップキャストしたときに挙動が異なります。

// 基底クラスと派生クラスを用意
public class BaseClass
{
    public virtual void Execute()
    {
        Console.WriteLine("Base");
    }
}

public class OverrideClass : BaseClass
{
    public override void Execute()
    {
        Console.WriteLine("Override");
    }
}

public class NewClass : BaseClass
{
    public new void Execute()
    {
        Console.WriteLine("new");
    }
}
// 実際に挙動が異なる場合
private static void Main(string[] args)
{
    BaseClass overrideClass = new OverrideClass();
    BaseClass newClass = new NewClass();

    // Override
    overrideClass.Execute();

    // Base
    newClass.Execute();
}

さいごに

SOLID原則にリスコフの置換原則という考え方があります。

ja.wikipedia.org

この原則についてマイクロソフトが触れているのですが,newキーワードはこの原則を破る可能性が高いということが指摘されています。

リスコフの置換の原則は、継承クラスの置換を管理する場合のガイドラインを定義しています。基本クラスの代わりにオブジェクトの継承クラスを渡しても、呼び出されるメソッドの既存機能に支障をきたすことがなく、特定のインターフェイスの実装はすべて互いに置き換えられるべきである、という原則です。

C# で SOLID の原則に違反する危険性 | Microsoft Docs


一応補足として紹介させていただきました。

ではまた。