CS401~800

C#のコンパイラエラーCS0621について解説

CS0621はC#のコンパイラーエラーの一つです。

virtualやabstractなメンバーにprivate修飾子を指定すると発生します。

これは派生クラスでのオーバーライドができないため、正しいアクセス修飾子(たとえばpublicやprotected)を使用する必要があります。

エラーCS0621の発生原因

仮想メンバーと抽象メンバーの仕様

C#において、仮想メンバーvirtualと抽象メンバーabstractは、派生クラスでのオーバーライドを許容するために利用されます。

仮想メンバーは、基本クラスで実装が提供され、派生クラスで必要に応じて再定義することができます。

一方、抽象メンバーは基本クラス側で実装を持たず、派生クラスで必ずオーバーライドして実装を提供しなければなりません。

この仕組みにより、ポリモーフィズムを利用した柔軟なコード設計が可能となります。

private修飾子使用時の制約

virtualabstractなメンバーがprivate修飾子を付与されると、派生クラスからアクセスできないため、オーバーライドの意味を失ってしまいます。

C#コンパイラは、仮想または抽象メンバーに対してprivateを使用することが許されないため、エラーCS0621が発生します。

このエラーは、コード内においてメソッドやプロパティの宣言にprivate virtualまたはprivate abstractが含まれている場合に表示されます。

オーバーライド不可となる理由

オーバーライドは、基底クラスのメンバーを派生クラスで再実装する仕組みです。

仮にprivateを指定すると、基底クラスのメンバーは派生クラスから見えなくなり、オーバーライドが不可能となります。

したがって、virtualabstractなメンバーには派生クラスからアクセス可能な修飾子(例:protectedpublic)を付与する必要があります。

発生するコード例

CS0621が発生するサンプルコード

以下は、エラーCS0621が発生するサンプルコードです。

このサンプルでは、private修飾子が仮想メソッドおよび抽象メソッドに指定されているため、コンパイルエラーとなります。

using System;
abstract class MyClass
{
    // 仮想メソッドにprivateを指定している(エラーCS0621)
    private virtual void DoNothing1()   // エラー発生
    {
        // 処理は不要です
    }
    // 抽象メソッドにprivateを指定している(エラーCS0621)
    private abstract void DoNothing2();   // エラー発生
    public static void Main()
    {
        // 実行用のエントリーポイント
        Console.WriteLine("CS0621エラーのサンプルコード");
    }
}
// コンパイル時に以下のエラーが表示されます。
// 'DoNothing1': 仮想または抽象メンバーには、private を指定できません
// 'DoNothing2': 仮想または抽象メンバーには、private を指定できません

仮想メソッドと抽象メソッドの誤った宣言

仮想メソッドまたは抽象メソッドにおいて、private修飾子が原因でエラーが発生するケースを下記に示します。

それぞれの例で、宣言の誤りをわかりやすく解説いたします。

仮想メソッドでのエラー例

仮想メソッドの場合、privateを指定すると派生クラスでオーバーライドできないため、エラーになります。

下記のコードはその一例です。

using System;
class BaseClass
{
    // private virtual はエラーとなります
    private virtual void DisplayMessage()  // エラー発生
    {
        Console.WriteLine("基本クラスのメッセージ");
    }
}
class DerivedClass : BaseClass
{
    // オーバーライドを試みても、基本クラスのメソッドが非公開のためコンパイルエラーとなります
    public override void DisplayMessage()  // エラー発生
    {
        Console.WriteLine("派生クラスのメッセージ");
    }
}
public class Program
{
    public static void Main()
    {
        Console.WriteLine("仮想メソッドでのエラー例");
    }
}
// コンパイル時にエラーが発生します。
// 'DisplayMessage': 仮想または抽象メンバーには、private を指定できません

抽象メソッドでのエラー例

抽象メソッドも同様に、private修飾子が指定されると派生クラスでの実装ができなくなるため、エラーが発生します。

下記のコードをご確認ください。

using System;
abstract class AbstractBase
{
    // private abstract はエラーとなります
    private abstract void ProcessData();  // エラー発生
}
class ConcreteClass : AbstractBase
{
    // 抽象メソッドを実装しようとしても、基本クラスの定義自体がエラーのため実装できません
    public override void ProcessData()  // エラー発生
    {
        Console.WriteLine("データ処理の実装");
    }
}
public class Program
{
    public static void Main()
    {
        Console.WriteLine("抽象メソッドでのエラー例");
    }
}
// コンパイル時にエラーが発生します。
// 'ProcessData': 仮想または抽象メンバーには、private を指定できません

エラーの修正方法

適切なアクセス修飾子の選択

エラーを解消するためには、privateの代わりに派生クラスからアクセス可能な修飾子を使用する必要があります。

一般的には、protected修飾子を用いることで、派生クラスからのアクセスが可能となり、正しくオーバーライドができるようになります。

また、必要に応じてpublicにすることもできますが、設計の意図に合わせたアクセスレベルを選択することが大切です。

protected修飾子の利用事例

下記のサンプルコードでは、privateprotectedに変更することで、エラーが解消される例を示します。

using System;
abstract class MyClass
{
    // protected virtual に変更してエラーを解消
    protected virtual void DoNothing1()
    {
        // 何も行わない処理
        Console.WriteLine("基本クラス:何もしない");
    }
    // protected abstract に変更してエラーを解消
    protected abstract void DoNothing2();
}
class DerivedClass : MyClass
{
    // DoNothing1をオーバーライド
    protected override void DoNothing1()
    {
        Console.WriteLine("派生クラス:何もしない(オーバーライド)");
    }
    // DoNothing2を実装
    protected override void DoNothing2()
    {
        Console.WriteLine("派生クラス:抽象メソッドの実装");
    }
    public void ExecuteMethods()
    {
        DoNothing1();
        DoNothing2();
    }
}
public class Program
{
    public static void Main()
    {
        DerivedClass instance = new DerivedClass();
        instance.ExecuteMethods();
    }
}
基本クラス:何もしない(オーバーライド)
派生クラス:抽象メソッドの実装

コード修正の実践手順

エラーの原因となっているアクセス修飾子がprivateである箇所を特定し、派生クラスからアクセス可能な修飾子(例:protected)に変更します。

この手順は、開発環境上でエラーメッセージを確認しながら、該当箇所を修正するプロセスです。

エラーメッセージ解析のポイント

エラーメッセージは「{member}: 仮想または抽象メンバーには、private を指定できません」と表示されます。

このメッセージにより、エラーが発生しているメンバーと、その原因がアクセス修飾子にあることが明確です。

以下の手順で修正することが推奨されます。

  • エラーメッセージ内の対象メンバー名を確認
  • 対象メンバーがvirtualまたはabstractとして宣言されていることを確認
  • private修飾子をprotectedまたはpublicに変更
  • 変更後、コンパイルエラーが解消されたことを確認

エラー回避の注意事項

オーバーライドとアクセス修飾子の関係

オーバーライドを行う際、派生クラスが基底クラスのメンバーにアクセスできる必要があります。

そのため、仮想または抽象メンバーを宣言する際には、派生クラスからアクセス可能な修飾子(例:protectedpublic)を使用することが重要です。

正しいアクセス修飾子を選択することで、無用なエラーを回避し、クラス間の連携が円滑に行われます。

クラス設計時の確認項目

クラス設計時には、以下の項目を確認することが推奨されます。

  • メソッドが派生クラスでオーバーライドされる必要があるか
  • オーバーライドする場合、該当メソッドの修飾子は適切か(例:protectedまたはpublic)
  • アクセスレベルの選定がクラス設計の意図に沿っているか

これらの点に注意することで、CS0621エラーの根本原因を避け、安定したコード設計が実現できるようになります。

まとめ

本記事を読むと、C#のCS0621エラーが発生する原因と、仮想・抽象メンバーに対する不適切なprivate修飾子によるオーバーライド不能な状態が理解できます。

また、具体的なサンプルコードを通じて、正しいアクセス修飾子(例:protected)の選択方法やエラーメッセージの解析ポイントが分かり、適切な修正手順についても学べる内容となっています。

関連記事

Back to top button
目次へ