Bien, problema simple: si reintroduce un método, ocultará los métodos principales. Esto debería ser exactamente lo que quiere, pero comprueba este código:
type
TClassParent = class
public
procedure DoSomething; overload;
procedure DoSomething(Something: Integer); overload;
end;
TClassChild = class(TClassParent)
public
procedure DoSomething(SomethingElse: string); reintroduce;
end;
var
Child: TClassChild;
begin
Child := TClassChild.Create;
Child.DoSomething;
Child.DoSomething(1024);
Child.DoSomething('Something');
Esto le da dos errores! ¿Por qué? ¡Porque ambos métodos DoSomething en el padre están ahora ocultos! A veces, quieres esto. Otras veces, no lo haces. Y cuando no lo hace, es necesario añadir esos métodos que faltan a la clase de niño otra vez, llamando al método heredado así:
procedure TClassChild.DoSomething(SomethingElse: string);
begin
inherited DoSomething(SomethingElse);
end;
otra parte, esto es lo que quieres, ¿verdad? Ocultando todos los métodos parentales con el mismo nombre. Pero no olvide que aún puede llamar a los métodos heredados.
También tenga en cuenta cuando vincula interfaces a la clase principal. La clase secundaria todavía será compatible con la interfaz, pero llamar a los métodos a través de la interfaz en lugar de un objeto dará como resultado una llamada al padre, ¡no al niño!
Reintroducir métodos es una buena práctica en caso de que quiera ocultar métodos del padre. ¡También ocultará los métodos virtuales con el mismo nombre! Normalmente, sería mejor omitir los métodos virtuales, pero al cambiar la lista de parámetros, el uso de la reintroducción realmente deshabilitaría la clase principal en circunstancias normales fuera de la clase. Dentro de la clase, todavía tiene acceso a ellos, sin advertencias ...
Tank you! Ocultar todos los constructores de la clase base es exactamente lo que quiero. En la mayoría de los casos, una llamada de un ctor de clase base es insuficiente para inicializar completamente el objeto concreto. – hansmaad
Tenga en cuenta que reintroducir simplemente suprime una advertencia del compilador. El comportamiento del tiempo de ejecución es el mismo con o sin él. Tenga cuidado si oculta un destructor. Si llama a 'TObject.Free', nunca se llamará al destructor hijo. –
@Codeelegance, no. Reintroduce también hará que los métodos principales no estén disponibles. Sin Reintroduce, aún puede llamar al método principal sin ningún problema. Con la reintroducción, los métodos principales se "eliminaron", disponibles solo dentro de la clase secundaria. –