CS0~400

C# コンパイラエラーCS0113:overrideとnewの併用によるエラーについて解説

CS0113はC#のコンパイルエラーで、override修飾子とnewキーワードを同時に使用した際に発生します。

オーバーライドする場合はoverrideのみで十分なため、newキーワードは不要です。

エラーを解消するには、new修飾子を削除してください。

エラー発生の背景

CS0113エラーの意味と発生状況

CS0113エラーは、基本クラスのメンバーをオーバーライドする際に、同じメンバーに対してoverridenewを同時に指定した場合に発生します。

このエラーは、「override型のメンバー ‘メンバー名’ を、new または virtual にすることはできません」というメッセージで表示され、正しいオーバーライドの定義方法と隠蔽の定義方法が混同されていることを示しています。

overrideとnewキーワードの役割

overrideキーワードの機能

overrideキーワードは、基本クラスでabstractまたはvirtualとして定義されたメンバーを派生クラスで再実装(オーバーライド)するために使います。

この場合、基本クラスのメソッドの挙動を継承しつつ、派生クラスで新しい実装を提供できるため、ポリモーフィズムが実現されます。

たとえば、基本クラスで定義されたFooメソッドを派生クラスでオーバーライドすることで、派生クラス固有の動作を実装できます。

newキーワードの機能

一方、newキーワードは基本クラスのメンバーを派生クラスで隠蔽(シャドウイング)するために使用されます。

この方法では、基本クラスのメソッドとは別のメソッドとみなされるため、基本クラスの参照経由で呼び出された場合と、派生クラスの型の参照経由で呼び出された場合で異なる動作をすることがあります。

隠蔽は、基本クラスの実装と一線を画す新しい実装を提供する際に利用されますが、オーバーライドによる継承のメリットは享受できなくなります。

コンパイル時の処理とエラー出力

コンパイル時、C#コンパイラはメンバー定義の一貫性をチェックします。

派生クラスで同一メンバーに対してoverridenewを両方指定していると、コンパイラはどちらの動作を優先すべきか判断できず、エラーとして報告されます。

そのため、誤ったキーワードの組み合わせがある場合、エラーCS0113が発生します。

エラー原因と適切な実装方法

キーワード併用による不適切な実装例

コード例による誤使用の分析

以下は、overridenewを同時に使ってしまった誤った実装例です。

このコードはコンパイル時にCS0113エラーを発生させます。

// CS0113.cs
namespace MyNamespace
{
    // 基本クラスは抽象クラスとして定義
    abstract public class MyClass
    {
        public abstract void Foo(); // 抽象メソッド
    }
    // MyClassを継承したクラス
    public class MyClass2 : MyClass
    {
        // overrideとnewが同時に指定されているためエラーとなる
        override new public void Foo()
        {
            // メソッド実装(例:コンソール出力)
            System.Console.WriteLine("誤った実装");
        }
        public static int Main()
        {
            MyClass instance = new MyClass2();
            instance.Foo();
            return 0;
        }
    }
}
// コンパイルエラー: error CS0113: 'MyClass2.Foo()': override メンバーに new または virtual を同時に指定することはできません

この例では、MyClass2が基本クラスMyClassの抽象メソッドFooをオーバーライドする際に、誤ってnewキーワードも追加しているため、コンパイラがどちらの動作を行うべきか判断できずエラーが発生します。

正しいオーバーライド手法

newキーワード削除の必要性

オーバーライドを行う場合、基本クラスで定義されたabstractまたはvirtualメソッドを正しく継承するためには、newキーワードを削除する必要があります。

newキーワードはメンバーを隠蔽するものであり、オーバーライドの意図に合わないため、不要です。

正しくoverrideを用いた記述方法

以下は、エラーが発生しない正しいオーバーライドの実装例です。

こちらの例では、newキーワードが削除され、正しくoverrideのみが指定されています。

// 正しいオーバーライドの例
namespace MyNamespace
{
    // 基本クラスの定義
    abstract public class MyClass
    {
        public abstract void Foo(); // 抽象メソッド
    }
    // 基本クラスを継承した派生クラス
    public class MyClass2 : MyClass
    {
        // overrideのみ指定し、正しく実装する
        override public void Foo()
        {
            // メソッド実装(例:コンソール出力)
            System.Console.WriteLine("正しいオーバーライド実装");
        }
        public static int Main()
        {
            MyClass instance = new MyClass2();
            instance.Foo();
            return 0;
        }
    }
}
正しいオーバーライド実装

この実装では、基本クラスMyClassの抽象メソッドFoooverrideキーワードのみで派生クラスMyClass2が正しく再実装しています。

そのため、コンパイルエラーは発生せず、プログラムの実行結果として「正しいオーバーライド実装」が表示されます。

修正手順と検証の留意点

エラー修正の具体的な手順

コード修正のポイント

  1. 基本クラスでabstractまたはvirtualとして定義されたメソッドを確認します。
  2. 派生クラスで該当するメソッドをオーバーライドする際、newキーワードが含まれていないか確認してください。
  3. 誤ってoverride newと記述されている場合、newキーワードを削除し、overrideのみを残します。
  4. 修正後、プログラム全体で同様の誤用がないかを確認し、コードレビューを行います。

修正後のコンパイルチェック方法

修正後は、コンパイラでコードを再度ビルドし、エラーが解消されているかを確認してください。

コンパイルが正常に終了すれば、修正内容が正しく反映されたと判断できます。

また、開発環境のビルドツールやIDEの警告・エラーメッセージにも注意を払いながら確認を進めます。

プログラム動作確認の観点

コンパイルエラー再発防止の確認事項

  • 正しい継承関係が明確であるかどうかを再確認してください。
  • 基本クラスと派生クラス間でのメソッド宣言が一貫しているか、キーワードの使用方法に不整合がないかをチェックしてください。
  • 変更後、実行環境でプログラムを動かし、意図した動作が得られていることをテストすることも重要です。
  • 変更履歴を管理し、以前の誤った定義が再び適用される可能性を防ぐため、コードレビューやCIツールでの自動チェックを活用してください。

まとめ

この記事では、CS0113エラーの発生原因について、overridenewを同時に使用した場合に混乱が生じ、コンパイラがどちらを採用するか判断できずエラーになることを解説しました。

基本クラスの抽象または仮想メソッドを派生クラスで正しくオーバーライドする際は、overrideのみを使用し、newは不要である点を理解できます。

また、誤った実装例と正しい実装例を通して、エラー修正手順や動作確認のポイントも学ぶことができます。

関連記事

Back to top button
目次へ