Delphi: Como ocultar construtores ancestrais?

Atualizar: destruiu a questão com um exemplo mais simples, que não é respondido pela resposta originalmente aceita

Dada a seguinte classe e seu ancestral:

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;

Agora mesmoTCellPhone tem 3 construtores visíveis:

Taça: InteiroTaça: Inteiro; Bule: stringBule: string = ''

O que eu faço paraTCellPhone para que o construtor ancestral (Teapot: string = '') não está visível, deixando apenas os construtores declarados:

Taça: InteiroTaça: Inteiro; Bule: string

Nota: Normalmente, o simples ato detendo um construtor descendente oculta o ancestral:

TCellPhone = class(TComputer)
public
   constructor Create(Cup: Integer); virtual;
end;
Taça: Inteiro

E se vocêprocurado para manter o construtor ancestral e o descendente, você marcaria o descendente como umoverload:

TCellPhone = class(TComputer)
public
   constructor Create(Cup: Integer); overload; virtual;
end;
Taça: InteiroBule: string = ''

No código de exemplo desta pergunta, Delphi está confundindo minhaoverload palavras-chave:

TCellPhone = class(TComputer)
public
   constructor Create(Cup: Integer); overload; virtual;
   constructor Create(Cup: Integer; Teapot: string); overload; virtual;
end;

Pensar que:

Eu quero sobrecarregar meus construtores com oantepassado,quando realmente quero sobrecarregá-lo com oirmão

Como oculto o construtor ancestral?

Nota: Pode ser impossível ocultar o construtor ancestral, não virtual, usando a linguagem Delphi como está atualmente definida."Não é possivel" é uma resposta válida.

Tentativa de resposta (com falha)

i tentou marcando os construtores descendentes comreintroduce (voltando ao meu modo de adicionar palavras-chave aleatoriamente até que funcione):

TCellPhone = class(TComputer)
public
   constructor Create(Cup: Integer); reintroduce; overload; virtual;
   constructor Create(Cup: Integer; Teapot: string); reintroduce; overload; virtual;
end;

Mas isso não funcionou, todos os três construtores ainda são visíveis. :(

Pergunta original

Eu tenho um objeto que desce de uma classe que tem construtores não quer ver:

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)

Nota: Este é um exemplo hipotético. Como no mundo real, os objetos ancestrais não podem ser alterados sem quebrar o código existente.

Agora, quando alguém está usandoTiPhone eu não quero que eles sejam capazes deVejo o construtor deTEniac:

iphone := TiPhone.Create(powerCord);

Pior ainda: se eles chamam isso de construtor, perdem completamente o meu construtor e tudo o que é feito no meio. É muito fácil chamar o construtor errado, todos eles são visíveis na conclusão do código IDE e compilarão:

TiPhone.Create;

e eles recebem um objeto completamente inválido.

eu poderia mudarTCellPhone para lançar uma exceção nesses construtores:

TCellPhone.Create(PowerCord: TPowercord)
begin
   raise Exception.Create('Don''t use.');
end;

Mas os desenvolvedores não perceberão que estão chamando o construtor errado até que o cliente encontre o erro um dia e nos multe em bilhões de dólares. Na verdade, eu soutentando para encontrar em todos os lugares que chamo de construtor errado - mas não consigo descobrir como fazer o Delphi me dizer!

questionAnswers(6)

yourAnswerToTheQuestion