2008-09-10 15 views
7

コードに明示的な呼び出しがない場合、Delphiの呼び出しはオーバーライドされたプロシージャで継承されますか(継承されますか?明示的な呼び出しがない場合、Delphiの呼び出しは継承されます

TFormは>> TBaseForm >> TAnyOtherForm

これは、すべてのフォームで使用されているすべての標準セットアップと破壊的な部分があります、プロジェクトのすべてのフォームは、TBaseFormから派生されます(セキュリティ、バリデーションect)。

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

また、私のために継承されている場合は、いつ呼び出しますか?

答えて

17

いいえ、継承された離れて呼び出しを残すと、呼び出されません。それ以外の場合は、メソッドをオーバーライドしてその親バージョンを完全に削除することはできません。

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; 
3

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

1

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

0

いいえこれはオーバーライドのポイントです。

2

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

0

明示的に呼び出す必要があります。継承されたメソッドを呼び出すコードのどの時点で選択できるので、柔軟性が大幅に向上します。しかし、それはバグの大きな原因でもあります。継承された関数を呼び出すことを忘れるのは簡単です。コンパイラは意図的に行ったのか、忘れたのかを判断する方法がありません。

継承されたメソッドを呼びたくないということをコンパイラに伝えるために、何らかのディレクティブ "skip_inherited"があるはずです。

"継承された"または "skip_inherited"が見つからなかった場合、コンパイラはエラーを簡単に報告します。それはあなたが忘れたことを意味します。しかし残念ながら、CodeGearの誰もそれを考えていませんでした。

関連する問題