8

コードに明示的な呼び出しがない場合、つまり(継承された;)オーバーライドされたプロシージャで継承されたDelphi呼び出しはありますか、私は次の構造を持っています(スーパークラスからサブクラスへ)

TForm >> TBaseForm >> TAnyOtherForm

プロジェクト内のすべてのフォームは TBaseForm から派生します。これは、すべてのフォーム (セキュリティ、検証など) に使用されるすべての標準セットアップおよび破壊的な部分が含まれているためです。

TBaseForm には、これを行うためのコードを含む onCreate および onDestroy プロシージャがありますが、誰か (つまり私) が TAnyOtherForm の onCreate に継承を追加するのを忘れた場合、Delphi は私のためにそれを呼び出しますか? 必須ではないというウェブ上の参照を見つけましたが、コードから省略された場合に呼び出されるかどうかはどこにもありません。

また、継承を呼び出す場合、いつ呼び出されますか?

4

7 に答える 7

18

いいえ、呼び出しを継承されたままにしておくと、呼び出されません。そうしないと、メソッドをオーバーライドして、その親バージョンを完全に省略することができなくなります。

于 2008-09-10T09:53:15.123 に答える
3

継承された呼び出しは明示的に行う必要があります。一般に、同等の状況で継承された関数を自動的に呼び出す言語はありません (クラス コンストラクターは含まれません)。

クラスコンストラクターで継承された呼び出しを行うことを忘れがちです。このような状況で、基本クラスがデータを初期化する必要がある場合、アクセス違反が発生するのを待っています。

おそらく、TBaseForm クラスで DoCreate と DoDestory をオーバーライドして、子クラスの実装に関係なく一部のコードが実行されるようにすることができます。

// interface

TBaseForm = Class(TForm)
...
Protected
    Procedure DoCreate(Sender : TObject); Override;
End

// implementation

Procedure TBaseForm.DoCreate(Sender : TObject);
Begin
    // do work here

    // let parent call the OnCreate property  
    Inherited DoCreate(Sender);
End;
于 2008-09-10T11:13:33.650 に答える
3

オブジェクトの Destroy で inherited を呼び出さないと、メモリ リークが発生する可能性があることに注意してください。ソース コードでこれを確認するために使用できるツールがあります。

于 2008-09-10T11:46:46.580 に答える
2

Inherited は、ビジュアル フォームの継承だけでなく、子孫オブジェクトでも明示的に呼び出す必要があります。クラス補完を使用する場合、定義にオーバーライドのフラグを立てていれば (ただし、再導入用ではない)、自動的に継承が追加されます。視覚的なフォームの継承を使用している場合、フォーム エディターを使用して新しいイベント ハンドラーを追加すると、継承も追加されます。

于 2008-09-12T02:13:02.730 に答える
1

他の人が示しているように、継承されたコードは暗黙的に呼び出されません。明示的に呼び出す必要があります。これにより、便利な柔軟性が得られます。たとえば、継承されたコードの前にいくつかの前処理コードを実行し、その後にいくつかの後処理コードを実行したい場合があります。これは次のようになります。

procedure TMyCalcObject.SolveForX;
begin
  ResetCalcState;
  inherited SolveForX;
  PostProcessSolveForX;
end;
于 2008-09-11T20:18:09.137 に答える
0

いいえ。それがオーバーライドの要点です。

于 2008-09-11T20:21:32.950 に答える