E2021 クラス型が必要です(Delphi)

提供: RAD Studio
移動先: 案内検索

エラーと警告のメッセージ(Delphi) への移動


コンパイル時に、次の状況でクラス型が必要になります。

クラス定義で必要なクラス型

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.

詳細は、「例外の生成」を参照してください。