var
test: TTest;
begin
test:= TTest.Create; //this constructor is still visible and usable!
end;
を誰もがこのコンストラクタを隠すことで私を助けることができますか?
var
test: TTest;
begin
test:= TTest.Create; //this constructor is still visible and usable!
end;
を誰もがこのコンストラクタを隠すことで私を助けることができますか?
限り、あなたがCreate
という名前のコンストラクタをオーバーロードしているとして、あなたはパラメータなしTObject
コンストラクタを隠すことはできません。
この
は、ここで議論されている:あなたはあなたのクラスとの間で別のクラスを置くために準備されている場合 http://www.yanniel.info/2011/08/hide-tobject-create-constructor-delphi.htmlTObject
あなたが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;
CreateまたはTObjectに特別なことがありますか?または、このルールはオーバーロードされていない非仮想基本メソッドと同じ名前のすべてのオーバーロードされたメソッドに一般化されますか? –
一般的です。派生クラスのすべてのオーバーロードされたメソッド(およびすべてのクラス)は自動的に継承されたメソッドを過負荷にします。 –
@Rob私が言うことができる限り、コンストラクタには特別なものはありません。 'Create'、' TObject'です。同じ動作は、通常の方法で再現することができます。 –
オーバーロードされていない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;
私は議論に少し遅れていますが、最初のコードスニペットは警告を出さないでしょう。なぜなら、 'TObject.Create'は仮想でも動的でもないからです。それはまた、「再導入」が効果がなく、まったく必要でない理由です。 –
をあなたがしたいのはなぜ?あなたは何を達成しようとしていますか? –
+1。私はこれが前に尋ねられたと思ったが、私が見つけた唯一の質問はこれほど簡潔ではなかった。 –
@Marjan Venema:私は標準クラスを作りたいと思います。私のクラスはこのデフォルトのコンストラクタを持つべきではありません。 – Javid