¿La llamada de Delphi se hereda en procedimientos anulados si no hay una llamada explícita?

StackOverflow https://stackoverflow.com/questions/53715

  •  09-06-2019
  •  | 
  •  

Pregunta

¿La llamada de Delphi se hereda en procedimientos anulados si no hay una llamada explícita en el código, es decir (heredada); tengo la siguiente estructura (de superclase a subclase)?

TForm >> TBaseForm >> TAcualquierOtraForma

Todos los formularios del proyecto se derivarán de TBaseForm, ya que tendrá todas las partes destructivas y de configuración estándar que se utilizan para cada formulario (seguridad, validación, etc.).

TBaseForm tiene procedimientos onCreate y onDestroy con el código para hacer esto, pero si alguien (es decir, yo) olvidó agregar heredado a onCreate en TAnyOtherForm, ¿Delphi lo llamaría por mí?He encontrado referencias en la web que dicen que no es obligatorio, pero en ninguna parte dice si se llama si se omite en el código.

Además, si me llama heredado, ¿cuándo lo llamará?

¿Fue útil?

Solución

No, si deja la llamada heredada, no se llamará.De lo contrario, no sería posible anular un método y omitir totalmente su versión principal.

Otros consejos

Vale la pena mencionar que no llamar a heredado en Destroy de ningún objeto puede causar pérdidas de memoria.Hay herramientas disponibles para verificar esto en su código fuente.

La llamada heredada debe realizarse explícitamente.En general, ningún lenguaje llama automáticamente a la función heredada en situaciones equivalentes (no se incluyen los constructores de clases).

Es fácil olvidarse de realizar la llamada heredada en un constructor de clase.En tal situación, si una clase base necesita inicializar cualquier dato, tendrá una infracción de acceso esperando a ocurrir.

Quizás podría anular DoCreate y DoDestory en su clase TBaseForm para asegurarse de que parte del código se ejecute independientemente de la implementación de las clases secundarias.

// interface

TBaseForm = Class(TForm)
...
Protected
    Procedure DoCreate(Sender : TObject); Override;
End

// implementation

Procedure TBaseForm.DoCreate(Sender : TObject);
Begin
    // do work here

    // let parent call the OnCreate property  
    Inherited DoCreate(Sender);
End;

Heredado debe llamarse explícitamente en objetos descendientes así como en herencia de forma visual.Si utiliza la finalización de clase, se agrega lo heredado automáticamente si marcó la definición como anulada (pero no para reintroducirla).Si está utilizando la herencia de formulario visual, cuando agregue un nuevo controlador de eventos a través del editor de formularios, también se agregará el heredado.

El código heredado no se llama implícitamente, como han indicado los demás.Debes llamarlo explícitamente.Esto le brinda cierta flexibilidad útil.Por ejemplo, es posible que desee realizar un código de preprocesamiento antes del código heredado y luego realizar un código de posprocesamiento.Esto podría verse así:

procedure TMyCalcObject.SolveForX;
begin
  ResetCalcState;
  inherited SolveForX;
  PostProcessSolveForX;
end;

No.Ese es el objetivo de anular.

Debes llamarlo explícitamente.Esto permite mucha flexibilidad, ya que puede elegir en qué punto del código llamar al método heredado.Pero también es una gran fuente de errores.Es fácil olvidar llamar a la función heredada y el compilador no tiene forma de saber si lo hizo deliberadamente o simplemente lo olvidó.

Debería haber algún tipo de directiva "skip_inherited" para indicarle al compilador que no desea llamar al método heredado.

El compilador informaría fácilmente un error si no encontrara "heredado" o "skip_inherited".Eso significaría que lo olvidaste.Pero lamentablemente nadie en CodeGear pensó en eso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top