簡単な問題:メソッドを再導入すると、親メソッドが非表示になります。これは正確に何をしたいことが、このコードをチェックする必要があります
type
TClassParent = class
public
procedure DoSomething; overload;
procedure DoSomething(Something: Integer); overload;
end;
TClassChild = class(TClassParent)
public
procedure DoSomething(SomethingElse: string); reintroduce;
end;
var
Child: TClassChild;
begin
Child := TClassChild.Create;
Child.DoSomething;
Child.DoSomething(1024);
Child.DoSomething('Something');
これは、あなたエラーが発生します!どうして?親の両方のDoSomethingメソッドは現在非表示になっています。時々、あなたはこれをしたい。それ以外の時は、あなたはしません。そして、あなたは、あなたがこのような継承されたメソッド呼び出し、再び子クラスにそれらの不足しているメソッドを追加する必要がない場合:再度、その後
procedure TClassChild.DoSomething(SomethingElse: string);
begin
inherited DoSomething(SomethingElse);
end;
を、これは右、何をしたいのですか? すべて同じ名前の親メソッド。ただし、引き続き継承されたメソッドを呼び出すことができることを忘れないでください。
インターフェイスを親クラスにリンクするときにも注意してください。子クラスは引き続きインターフェースをサポートしますが、オブジェクトではなくインターフェースを通してメソッドを呼び出すと、子ではなく親にコールされます。
メソッドを再導入するのは、親からメソッドを隠したい場合に適しています。また、同じ名前の仮想メソッドも非表示にします。通常は、仮想メソッドをオーバーライドするだけでは問題ありませんが、パラメータリストを変更するときは、reintroduceを使用すると、通常はクラス外からの親クラスが実際に無効になります。クラス内では、警告なしでまだそれらにアクセスできます。
タンクしてください!基本クラスのすべてのコンストラクタを隠すことは、まさに私が望むものです。ほとんどの場合、基本クラスの呼び出しは、具体的なオブジェクトを完全に初期化するには不十分です。 – hansmaad
再導入すると、単にコンパイラ警告が抑制されることに注意してください。実行時の動作は、実行時の動作と同じです。デストラクタを隠す場合は注意してください。 'TObject.Free'を呼び出すと、子デストラクタは決して呼び出されません。 –
@コーデリアンス、いいえ。再導入すると、親メソッドも使用できなくなります。再導入なしでは、問題なく親メソッドを呼び出すことができます。再導入すると、それらの親メソッドは "なくなり"、子クラス内からのみ使用できます。 –