更新:私が最初に持っていた例は、ちょっと複雑でした。これは、1つのコードブロックですべてを説明する簡単な8行の例です。以下はコンパイルされないため、警告が表示されます。
TComputer = class(TObject)
public
constructor Create(Cup: Integer); virtual;
end;
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer; Teapot: string); virtual;
end;
注:この質問は、Delphiのコンストラクターの微妙さに関する私の進行中の一連の質問のパート3です。
元の質問
既存のクラスにコンストラクターを追加するにはどうすればよいですか?
架空の例を挙げましょう(つまり、ここでSOエディターに入力しているので、コンパイルされる場合とされない場合があります)。
TXHTMLStream = class(TXMLStream)
public
...
end;
TXHTMLStream
さらに、通常の使用では、使用する前に多くの繰り返しコードを実行する必要があると想定します。
var
xs: TXHTMLStream;
begin
xs := TXHTMLStream.Create(filename);
xs.Encoding := UTF32;
xs.XmlVersion := 1.1;
xs.DocType := 'strict';
xs.PreserveWhitespace := 'true';
...
xs.Save(xhtmlDocument);
ボイラープレートのセットアップコードをすべて単純化するコンストラクターを作成したいとします。
TXHTMLStream = class(TXMLStream)
public
constructor Create(filename: string; Encoding: TEncoding); virtual;
end;
constructor TXHTMLStream.Create(filename: string; Encoding: TEncoding);
begin
inherited Create(filename);
xs.Encoding := Encoding;
xs.XmlVersion := 1.1;
xs.DocType := 'strict';
xs.PreserveWhitespace := True;
...
end;
これにより、オブジェクトの使用が簡単になります。
var
xs: TXHTMLStream;
begin
xs := TXHTMLStream.Create(filename, UTF32);
xs.Save(xhtmlDocument);
今を除いて、Delphiは私の新しいコンストラクターが古いコンストラクターを隠していると不平を言います。
メソッド「作成」は、基本タイプ「TXMLStream」の仮想メソッドを非表示にします
私は確かに祖先の作成を隠すつもりはありませんでした-私は両方が欲しいです。
祖先コンストラクターを保持したまま、子孫クラスに(異なるシグネチャを持つ)コンストラクターを追加して、引き続き使用できるようにするにはどうすればよいですか?