Delphi: Quando reintroduzir os antepassados ocultos e quando os mostrar?
Hoje Recentemente, no Stackoverflow, aprendi que:
reintroduzir é usado paraocultar construtores ancestraisreintroduzir é usado paramostrar construtores ancestraisEu tenho tentado entender tudo, então aqui está outra questão muito específica,apoiando minha pergunta principal que lida com construtores.
Atualizar: substituiu toda a pergunta:
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;
Ao construir o TCellPhone, três construtores estão disponíveis:
Taça: InteiroTaça: Inteiro; Bule: string[Bule: String = '']Pergunta: Por que éconstructor(Teapot: string='')
não está escondido?
Agora eu adicionei um terceiro descendente:
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;
TiPhone = class(TCellPhone)
public
constructor Create(Cup: Integer); override;
end;
Ao construirTiPhone
quatro construtores estão disponíveis:
Por que existemquatro construtores? Substituí um dos três existentes.Editar: Isso pode ser um bug no insight do código, ele me mostra quatro - mas como eu poderia ligar quando dois são iguais?
Usando o código original novamente:
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;
já se sabe queTCellPhone
possui três construtores:
Como altero a declaração deTCellPhone
esconder o construtor ancestral? por exemplo. de modo a:
TNokia = class(TCellPhone)
end;
terá apenas dois construtores:
Taça: InteiroTaça: Inteiro; Bule: stringAgora, o caso em quereintroduce
é usado para ocultar um ancestral não virtual. No caso anteriorTiPhone
possui quatro construtores (idealmente haveria apenas dois - comTComputer
de alguma forma escondendo seu ancestral). Mas mesmo que eu não consiga consertarTComputer
, eu posso mudarTiPhone
ter apenas um:
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;
TiPhone = class(TCellPhone)
public
constructor Create(Cup: Integer); reintroduce;
end;
AgoraTiPhone
possui apenas um construtor:
Reintroduzir normalmente é usado apenas para suprimir o aviso sobre ocultarvirtual antepassados. Nesse caso:
Create(Teapot: string = '')
não é virtual - ainda posso usar a reintrodução para ocultá-lo.
Masagora, se eu adicionar outro sobrecarregado aoTiPhone
:
TiPhone = class(TCellPhone)
public
constructor Create(Cup: Integer); reintroduce; overload;
constructor Create(Handle: String); overload;
end;
De repente, os ancestrais (anteriormente ocultos) voltam:
TiPhone.Create (7);TiPhone.Create ('rosa');TiPhone.Create (7, 'rosa');TiPhone.Create ();Como você pode ver, estou lutando para entender a lógica de
quando algo está escondidocomo esconder algoquando algo é mostradocomo mostrar algo