Delphi: ¿Cuándo reintroduce los ancestros escondidos y cuándo los muestra?
Hoy Recientemente en Stackoverflow aprendí que:
reintroducir se utiliza paraesconder constructores ancestralesreintroducir se utiliza paraespectáculo constructores ancestralesHe estado tratando de darle sentido a todo, así que aquí hay otra pregunta muy específica,apoyando mi pregunta principal sobre constructores.
Actualizar: reemplazó toda la pregunta:
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;
Al construir TCellPhone, hay 3 constructores disponibles:
Copa: EnteroCopa: Entero; Tetera: cadena[Tetera: Cadena = '']Pregunta: ¿Por qué esconstructor(Teapot: string='')
no estar oculto?
Ahora agregué un tercer descendiente:
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;
Al construirTiPhone
cuatro los constructores están disponibles:
Por qué haycuatro constructores? anulé uno de los tres existentes.Editar: Esto puede ser un error en el conocimiento del código, me muestra cuatro; sin embargo, ¿cómo podría llamar cuando dos son iguales?
Usando el código original nuevamente:
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;
ya se sabe queTCellPhone
tiene tres constructores:
¿Cómo modifico la declaración deTCellPhone
para ocultar el constructor ancestro? p.ej. así que eso:
TNokia = class(TCellPhone)
end;
solo tendrá dos constructores:
Copa: EnteroCopa: Entero; Tetera: cadenaAhora para el caso dondereintroduce
se usa para ocultar un ancestro no virtual. En el caso anteriorTiPhone
tiene cuatro constructores (idealmente solo habría dos, conTComputer
de alguna manera ocultando a su antepasado). Pero incluso si no puedo arreglarTComputer
, puedo cambiarTiPhone
tener solo uno:
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;
AhoraTiPhone
tiene un solo constructor:
Reintroducir normalmente solo se usa para suprimir la advertencia sobre la ocultaciónvirtual antepasados En este caso:
Create(Teapot: string = '')
no es virtual, pero todavía puedo usar reintroducir para ocultarlo.
Peroahora, si agrego otro sobrecargado aTiPhone
:
TiPhone = class(TCellPhone)
public
constructor Create(Cup: Integer); reintroduce; overload;
constructor Create(Handle: String); overload;
end;
Entonces, de repente, los ancestros (previamente ocultos) regresan:
TiPhone.Create (7);TiPhone.Create ('rosa');TiPhone.Create (7, 'rosa');TiPhone.Create ();Como puede ver, estoy luchando por comprender la lógica de
cuando algo esta ocultocomo esconder algocuando se muestra algocomo mostrar algo