Delphi: Como adicionar um construtor diferente a um descendente?
Atualizar: O exemplo que eu originalmente tinha era meio complexo. Aqui está um exemplo simples de 8 linhas que explica tudo em um bloco de código. Os seguintesnão compila emite um aviso:
TComputer = class(TObject)
public
constructor Create(Cup: Integer); virtual;
end;
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer; Teapot: string); virtual;
end;
Nota: Esta questão faz parte 3 da minha série contínua de perguntas sobre as sutilezas dos construtores em Delphi
Pergunta originalComo posso adicionar um construtor a uma classe existente?
Vamos dar um exemplo hipotético (ou seja, um que eu estou digitando aqui no editor SO, para que ele possa ou não compilar):
TXHTMLStream = class(TXMLStream)
public
...
end;
Suponha ainda que o uso normal deTXHTMLStream
envolveu a execução de muito código repetido antes de poder ser usado:
var
xs: TXHTMLStream;
begin
xs := TXHTMLStream.Create(filename);
xs.Encoding := UTF32;
xs.XmlVersion := 1.1;
xs.DocType := 'strict';
xs.PreserveWhitespace := 'true';
...
xs.Save(xhtmlDocument);
Suponha que eu queira criar um construtor que simplifique todo esse código de configuração padrão:
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;
Isso simplifica o uso do objeto para:
var
xs: TXHTMLStream;
begin
xs := TXHTMLStream.Create(filename, UTF32);
xs.Save(xhtmlDocument);
Exceto agora, o Delphi reclama que meu novo construtor oculta o antigo construtor.
O método 'Criar' oculta o método virtual do tipo base 'TXMLStream'
eu certamente nãosignificar ocultar o ancestral criar - iquer ambos.
Como adiciono um construtor (com umdiferente assinatura) a uma classe descendente, mantendo o construtor ancestral para que ele ainda possa ser usado?