更新:最初に受け入れられた回答では回答されない、より単純な例で質問を根絶しました
次のクラスとその祖先が与えられます。
TComputer = class(TObject)
public
constructor Create(Teapot: string='');
end;
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer); overload; virtual;
constructor Create(Cup: Integer; Teapot: string); overload; virtual;
end;
現在TCellPhone
、3つのコンストラクターが表示されています。
- カップ:整数
- カップ:整数; ティーポット:文字列
- ティーポット:文字列=''
TCellPhone
祖先コンストラクター(Teapot: string = ''
)が表示されず、宣言されたコンストラクターのみが残るようにするにはどうすればよいですか?
- カップ:整数
- カップ:整数; ティーポット:文字列
注:通常、子孫コンストラクターを持つという単純な行為は、祖先を非表示にします。
TCellPhone = class(TComputer) public constructor Create(Cup: Integer); virtual; end;
- カップ:整数
また、祖先コンストラクターと子孫の両方を保持したい場合は、子孫を
overload
:としてマークします。TCellPhone = class(TComputer) public constructor Create(Cup: Integer); overload; virtual; end;
- カップ:整数
- ティーポット:文字列=''
この質問のサンプルコードでは、Delphiが私のoverload
キーワードを間違えています。
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer); overload; virtual;
constructor Create(Cup: Integer; Teapot: string); overload; virtual;
end;
それを考える:
- コンストラクターを祖先でオーバーロードしたい、
- 本当に兄弟でオーバーロードしたいとき
祖先コンストラクターを非表示にするにはどうすればよいですか?
注:現在定義されているDelphi言語を使用して、祖先の非仮想コンストラクターを非表示にすることは不可能な場合があります。「不可能」は有効な答えです。
試行された回答(失敗)
子孫コンストラクターに次のマークを付けてみreintroduce
ました(機能するまでキーワードをランダムに追加するモードにフォールバックします):
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer); reintroduce; overload; virtual;
constructor Create(Cup: Integer; Teapot: string); reintroduce; overload; virtual;
end;
しかし、それは機能しませんでした。3つのコンストラクターはすべて表示されたままです。:(
元の質問
コンストラクターが見たくないクラスの子孫であるオブジェクトがあります。
TEniac = class(TObject)
constructor Create(PowerCord: TPowerCord=nil); //calls inherited Create
TComputer = class(TEniac) ...
constructor Create(PowerCord: TPowerCord=nil); //calls inherited Create(nil)
TCellPhone = class(TComputer)
constructor Create(sim: TSimChip; UnlockCode: Integer); //calls inherited Create(nil)
TiPhone = class(TCellPhone)
constructor Create(sim: TSimChip); //calls inherited Create(sim, 0)
注:これは架空の例です。現実の世界と同様に、祖先オブジェクトは既存のコードを壊さずに変更することはできません。
今、誰かが使用しているとき、私は彼らがコンストラクターを見るTiPhone
ことができることさえ望んでいません:TEniac
iphone := TiPhone.Create(powerCord);
さらに悪いことに、彼らがそのコンストラクターを呼び出すと、私のコンストラクターを完全に見逃し、その間にすべてが行われます。間違ったコンストラクターを呼び出すのは非常に簡単です。それらはすべてIDEコード補完に表示され、コンパイルされます。
TiPhone.Create;
そして、それらは完全に無効なオブジェクトを取得します。
TCellPhone
これらのコンストラクターで例外をスローするように変更できます。
TCellPhone.Create(PowerCord: TPowercord)
begin
raise Exception.Create('Don''t use.');
end;
しかし、開発者は、顧客がいつかエラーを見つけて数十億ドルの罰金を科すまで、間違ったコンストラクターを呼び出していることに気づきません。実際、私はどこでも間違ったコンストラクターを呼び出そうとしていますが、Delphiに教えてもらう方法がわかりません!