多くの抽象クラスを持つコンポーネントスイートを使用しています。ポリモーフィズムを適用したいのですが、オブジェクトを作成するとエラー抽象クラスが発生します。
必要がない場合でも、仮想であるすべてのメソッドをオーバーライドする必要がありますか?回避策や解決策はありますか?
クラスのインスタンスを作成するには、仮想抽象として宣言されているすべてのメソッドをオーバーライドする必要があります。使わなくても。
本当に回避策が必要な場合は、空のメソッドを使用できます。しかし、私はそれをお勧めしません。
そして、主題に関するいくつかの情報を追加するには:
仮想抽象で宣言されている場合、メソッドは抽象です。
procedure MyMethod(const AMyParameter: Integer); virtual; abstract;
雑学:メソッドを抽象としてオーバーライドすることもできます。
procedure MyMethod(const AMyParameter: Integer); override; abstract;
そのクラスからインスタンス化するには、これらのメソッドをオーバーライドする必要があります。
そして、クラス全体を抽象として宣言できます。
type
TMyClass = class abstract (TMyAncestor)
end;
そのクラスをインスタンス化しようとすると、警告が表示されます。
対応するクラスは封印されたクラスです。
type
TMyClass = class sealed (TMyAncestor)
end;
そのクラスから継承しようとすると、警告が表示されます。
メソッドを封印することもできますが、そのためにはキーワードfinalが必要です。
procedure MyMethod(const AMyParameter: Integer); override; final;
Delphiには、そのような抽象クラスはなく、抽象メソッドのみがあります。抽象メソッドを呼び出すと、抽象メソッドの例外が発生します。
簡単に言えば、抽象メソッドを呼び出さないでください。コンパイラは、抽象メソッドを使用してクラスをインスタンス化することを検出すると、ウォーミングを発行します。これらの警告をエラーに変換するようコンパイラーに依頼することをお勧めします。
次の場合、子孫クラスはまだ抽象です
abstract
と宣言されている、または抽象コンストラクターをオーバーライドすると、継承されたものが新しいコンストラクターに自動的に組み込まれるため、エラーが発生します。新しいコンストラクターは、コードのオートコンプリートを使用すると、もちろん抽象コンストラクターを呼び出します。
例えば.
type
TMyclass = class (TObject)
public
constructor Create(AOwner : TComponent); dynamic; abstract;
end;
TMyclass2 = class(TMyclass)
public
Constructor Create(AOwner : TComponent); override;
end;
implementation
constructor TMyclass2.Create(AOwner: TComponent);
begin
inherited;
end;