E2021 クラス型が必要です(Delphi)
エラーと警告のメッセージ(Delphi) への移動
コンパイル時に、次の状況でクラス型が必要になります。
- クラス型の上位クラスとして
- try-except 文の on 句で
- raise 文の第 1 引数として
- 前方宣言されたクラス型の最終的な型として
クラス定義で必要なクラス型
1 つ以上のインターフェイスを実装するクラスの宣言時に、親クラスを指定していないと、このエラーが発生します。たとえば次のような場合です。
TMyClass = class(IMyInterface1, IMyInterface2);
Delphi では、どのクラスも何らかの親クラスを継承するため、クラスの宣言時に親クラスを指定しないと、コンパイラはそのクラスが TObject を継承するものと想定します。つまり、次のコードはどちらの行も同じ意味です。
TMyClass = class;
TMyClass = class(TObject);
先ほどのコードを修正するには、クラスが実装するインターフェイスの前に親クラスを指定しなければなりません。
TMyClass = class(TObject, IMyInterface1, IMyInterface2);
ただし、TObject
を直接継承する場合は、すべてのインターフェイスのルートである IInterface の API を実装する必要があります。その場合に便利なクラスが TInterfacedObject です。ここにはその API が既に実装されています。
TMyClass = class(TInterfacedObject, IMyInterface1, IMyInterface2);
raise 文で必要なクラス型
文字列リテラルを raise しようとすると、このエラーが発生します。たとえば次のような場合です。
program Produce;
begin
raise 'This would work in C++, but does not in Delphi';
end.
そうではなく、例外オブジェクトを作成する必要があります。
program Solve;
uses SysUtils;
begin
raise Exception.Create('There is a simple workaround, however');
end.
詳細は、「例外の生成」を参照してください。