2010-11-18 20 views
6

私はDelphiで起動するときに、無意味なCreateコンストラクタの無駄な呼び出しを避ける唯一の方法は、例外またはアサーションをスローすることです。 今週初めてreintroduceキーワードを使用したとき、私はこの問題も解決するように思った。パラメータのない非表示を再作成して作成しますか?

Test = class 
private 
    n_ : Integer; 
public 
    constructor Create(n : Integer); reintroduce; 
end; 

Test.Createへの呼び出しは私に希望するコンパイラエラーが発生します。このアプローチに問題はありますか?

答えて

4

簡単な問題:メソッドを再導入すると、親メソッドが非表示になります。これは正確に何をしたいことが、このコードをチェックする必要があります

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を使用すると、通常はクラス外からの親クラスが実際に無効になります。クラス内では、警告なしでまだそれらにアクセスできます。

+0

タンクしてください!基本クラスのすべてのコンストラクタを隠すことは、まさに私が望むものです。ほとんどの場合、基本クラスの呼び出しは、具体的なオブジェクトを完全に初期化するには不十分です。 – hansmaad

+0

再導入すると、単にコンパイラ警告が抑制されることに注意してください。実行時の動作は、実行時の動作と同じです。デストラクタを隠す場合は注意してください。 'TObject.Free'を呼び出すと、子デストラクタは決して呼び出されません。 –

+0

@コーデリアンス、いいえ。再導入すると、親メソッドも使用できなくなります。再導入なしでは、問題なく親メソッドを呼び出すことができます。再導入すると、それらの親メソッドは "なくなり"、子クラス内からのみ使用できます。 –

1

コンストラクタを別のシグネチャで定義すると、他のコンストラクタが効果的に隠され、警告が表示されます。ディレクティブの再導入により、コンパイラは何をしているのかを知っているので、警告は表示されません。

唯一の効果は、以前のコンストラクタを非表示にすることです。

コンストラクタの複数のバリアントが必要な場合は、overloadディレクティブを使用できます。

+0

*非仮想*メソッドを隠すことについてコンパイラはいつ警告を出しましたか?間違いなく* Delphi 2005の後にいつか*私はそのような警告を見たことがない。 –

+0

完全には、btw。子でメソッドを定義すると、親メソッドがコードに公開されます。 Reintroduceは親メソッドをビューから隠し、直接使用することができないようにします。 (継承されたメソッドとして、またはインターフェイスを介して呼び出すことによっても)。 –

関連する問題