10

から派生したクラスがTObjectありますが、親メソッドを呼び出さないとダメですか? TObject.Create/を見たときDestroy、彼らは何もしないので、私は尋ねます。

そのため、それらを自分でオーバーライド/公開します。

コード例はありません。確認したいだけです。

4

3 に答える 3

17

最も一般的な動作は、 を呼び出すことinheritedです。したがって、継承された動作を明示的に望まない場合は、 を呼び出しませんinherited。そうでなければ、私はそうします。継承された動作が のようTObject.Create/Destroyに何もしない場合でも、 を呼び出しますinherited

コンストラクタとデストラクタの状況は、おそらく他のメソッドの状況とは少し異なることに注意してください。継承されたメソッドへの呼び出しをスキップする必要があることは非常にまれです。例が思いつきません。コンストラクターは常に他のオブジェクトを作成および破棄しているため、それをスキップすることをどのように考えることができるでしょうか?

の実装が何もしないことを知っているため、inheritedから直接派生するときに省略されるコードを作成する作成者がいることを私は知っています。私はそれが好きではなく、私にとってそれをするのは間違いです. の実装の詳細が派生クラスに漏れてはなりません。 TObjectTObjectTObject

私はそれTObject.Create/Destroyが常にノーオペレーションになると確信しています。Embarcadero がそれを変更した場合、非常に多くのコードが壊れてしまいます。しかし、あなたのクラスの1つはどうですか。から派生したクラスがあるとしますTObject。そして、そこから派生した別のクラスがあります。

TMyClass1 = class
  ....
end;

TMyClass2 = class(TMyClass)
  ....
end;

のコンストラクターがなくTMyClass1、コンストラクターはTMyClass2次のようになります。

constructor TMyClass2.Create;
begin
  // no need to call inherited, it's a no-op
  FMyObj := TBlahBlah.Create;
end;

次に、ある日、TMyClass1コンストラクターを変更して何かを行います。今TClass2は壊れています。そのため、呼び出しは何もしないため、呼び出しを省略することinheritedはありません。

通常のインスタンス メソッドの場合は少し異なります。基本クラスの実装を無視して、まったく新しい実装を提供する方が妥当です。ただし、スーパークラスにメソッドの空の実装があるかどうかではなく、派生クラスが何をしたいのかに基づいて決定してください。

于 2013-04-19T11:53:06.913 に答える