2012-12-22 5 views
16

は、このクラスを見てみましょうクラスがオーバーロードされている間に、継承されたTObjectコンストラクタを非表示にする方法はありますか?私たちは、クラスを使用したいとき今</p> <pre><code>TTest = class(TObject) public constructor Create(A:Integer);overload; constructor Create(A,B:Integer);overload; end; </code></pre> <p>:

var 
    test: TTest; 
begin 
    test:= TTest.Create; //this constructor is still visible and usable! 
end; 

を誰もがこのコンストラクタを隠すことで私を助けることができますか?

+0

をあなたがしたいのはなぜ?あなたは何を達成しようとしていますか? –

+1

+1。私はこれが前に尋ねられたと思ったが、私が見つけた唯一の質問はこれほど簡潔ではなかった。 –

+0

@Marjan Venema:私は標準クラスを作りたいと思います。私のクラスはこのデフォルトのコンストラクタを持つべきではありません。 – Javid

答えて

14

限り、あなたがCreateという名前のコンストラクタをオーバーロードしているとして、あなたはパラメータなしTObjectコンストラクタを隠すことはできません。

この

は、ここで議論されている:あなたはあなたのクラスとの間で別のクラスを置くために準備されている場合 http://www.yanniel.info/2011/08/hide-tobject-create-constructor-delphi.html

TObjectあなたがAndy Hausladen's trick使用することができます。

TNoParameterlessContructorObject = class(TObject) 
strict private 
    constructor Create; 
end; 

TTest = class(TNoParameterlessContructorObject) 
public 
    constructor Create(A:Integer);overload; 
    constructor Create(A,B:Integer);overload; 
end; 
+0

CreateまたはTObjectに特別なことがありますか?または、このルールはオーバーロードされていない非仮想基本メソッドと同じ名前のすべてのオーバーロードされたメソッドに一般化されますか? –

+3

一般的です。派生クラスのすべてのオーバーロードされたメソッド(およびすべてのクラス)は自動的に継承されたメソッドを過負荷にします。 –

+0

@Rob私が言うことができる限り、コンストラクタには特別なものはありません。 'Create'、' TObject'です。同じ動作は、通常の方法で再現することができます。 –

10

オーバーロードされていないCreateを導入するだけで、継承されたCreateを非表示にすることができます。あなたは、2つの作成過負荷に必要として、あなたは、オプションの二番目のパラメータで作成し1にそれらをマージすることができ、次のいずれか

TTest = class(TObject) 
public 
    constructor Create(A:Integer; B: Integer = 0); 
end; 

これは、デフォルトのパラメータなしのコンストラクタを隠していることを知らせる、コンパイラの警告を与えます。

TTest = class(TObject) 
public 
    constructor Create(A:Integer; B: Integer = 0); reintroduce; 
end; 

か、これが不可能な場合は、あなたが最初のオーバーロードされた二番目で、最終的なクラスを作成し、導入の中間クラスを導入することができます:あなたがそうのような隠れコンストラクタを宣言することができ、警告を取り除くために、 :TObjectから派生するとき

preTest = class(TObject) 
public 
    constructor Create(A:Integer); reintroduce; 
end; 

TTest = class(preTest) 
public 
    constructor Create(A,B:Integer);overload; 
end; 
+2

私は議論に少し遅れていますが、最初のコードスニペットは警告を出さないでしょう。なぜなら、 'TObject.Create'は仮想でも動的でもないからです。それはまた、「再導入」が効果がなく、まったく必要でない理由です。 –

関連する問題

 関連する問題