C#のコンパイラエラーCS0621について解説
CS0621はC#のコンパイラーエラーの一つです。
virtualやabstractなメンバーにprivate修飾子を指定すると発生します。
これは派生クラスでのオーバーライドができないため、正しいアクセス修飾子(たとえばpublicやprotected)を使用する必要があります。
エラーCS0621の発生原因
仮想メンバーと抽象メンバーの仕様
C#において、仮想メンバーvirtual
と抽象メンバーabstract
は、派生クラスでのオーバーライドを許容するために利用されます。
仮想メンバーは、基本クラスで実装が提供され、派生クラスで必要に応じて再定義することができます。
一方、抽象メンバーは基本クラス側で実装を持たず、派生クラスで必ずオーバーライドして実装を提供しなければなりません。
この仕組みにより、ポリモーフィズムを利用した柔軟なコード設計が可能となります。
private修飾子使用時の制約
virtual
やabstract
なメンバーがprivate
修飾子を付与されると、派生クラスからアクセスできないため、オーバーライドの意味を失ってしまいます。
C#コンパイラは、仮想または抽象メンバーに対してprivate
を使用することが許されないため、エラーCS0621が発生します。
このエラーは、コード内においてメソッドやプロパティの宣言にprivate virtual
またはprivate abstract
が含まれている場合に表示されます。
オーバーライド不可となる理由
オーバーライドは、基底クラスのメンバーを派生クラスで再実装する仕組みです。
仮にprivate
を指定すると、基底クラスのメンバーは派生クラスから見えなくなり、オーバーライドが不可能となります。
したがって、virtual
やabstract
なメンバーには派生クラスからアクセス可能な修飾子(例:protected
やpublic
)を付与する必要があります。
発生するコード例
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修飾子の利用事例
下記のサンプルコードでは、private
をprotected
に変更することで、エラーが解消される例を示します。
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
に変更- 変更後、コンパイルエラーが解消されたことを確認
エラー回避の注意事項
オーバーライドとアクセス修飾子の関係
オーバーライドを行う際、派生クラスが基底クラスのメンバーにアクセスできる必要があります。
そのため、仮想または抽象メンバーを宣言する際には、派生クラスからアクセス可能な修飾子(例:protected
やpublic
)を使用することが重要です。
正しいアクセス修飾子を選択することで、無用なエラーを回避し、クラス間の連携が円滑に行われます。
クラス設計時の確認項目
クラス設計時には、以下の項目を確認することが推奨されます。
- メソッドが派生クラスでオーバーライドされる必要があるか
- オーバーライドする場合、該当メソッドの修飾子は適切か(例:
protected
またはpublic
) - アクセスレベルの選定がクラス設計の意図に沿っているか
これらの点に注意することで、CS0621エラーの根本原因を避け、安定したコード設計が実現できるようになります。
まとめ
本記事を読むと、C#のCS0621エラーが発生する原因と、仮想・抽象メンバーに対する不適切なprivate修飾子によるオーバーライド不能な状態が理解できます。
また、具体的なサンプルコードを通じて、正しいアクセス修飾子(例:protected)の選択方法やエラーメッセージの解析ポイントが分かり、適切な修正手順についても学べる内容となっています。