web-dev-qa-db-ja.com

Delphiの抽象クラス

多くの抽象クラスを持つコンポーネントスイートを使用しています。ポリモーフィズムを適用したいのですが、オブジェクトを作成するとエラー抽象クラスが発生します。

必要がない場合でも、仮想であるすべてのメソッドをオーバーライドする必要がありますか?回避策や解決策はありますか?

18
marcostT

クラスのインスタンスを作成するには、仮想抽象として宣言されているすべてのメソッドをオーバーライドする必要があります。使わなくても。

本当に回避策が必要な場合は、空のメソッドを使用できます。しかし、私はそれをお勧めしません。

そして、主題に関するいくつかの情報を追加するには:

仮想抽象で宣言されている場合、メソッドは抽象です。

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;
25
Toon Krijthe

Delphiには、そのような抽象クラスはなく、抽象メソッドのみがあります。抽象メソッドを呼び出すと、抽象メソッドの例外が発生します。

簡単に言えば、抽象メソッドを呼び出さないでください。コンパイラは、抽象メソッドを使用してクラスをインスタンス化することを検出すると、ウォーミングを発行します。これらの警告をエラーに変換するようコンパイラーに依頼することをお勧めします。

5
David Heffernan

次の場合、子孫クラスはまだ抽象です

  1. abstractと宣言されている、または
  2. 抽象として宣言されたメソッドが少なくとも1つある、または
  3. 祖先からのすべての抽象メソッドをオーバーライドして実装するわけではありません
1
Ondrej Kelle

抽象コンストラクターをオーバーライドすると、継承されたものが新しいコンストラクターに自動的に組み込まれるため、エラーが発生します。新しいコンストラクターは、コードのオートコンプリートを使用すると、もちろん抽象コンストラクターを呼び出します。

例えば.

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;
0
user831258