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:
O que eu faço paraTCellPhone
para que o construtor ancestral (Teapot: string = ''
) não está visível, deixando apenas os construtores declarados:
Nota: Normalmente, o simples ato detendo um construtor descendente oculta o ancestral:
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer); virtual;
end;
Taça: InteiroE 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ãoComo 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 originalEu 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!