PDA

Ver la Versión Completa : Uso de inherited y override


JoAnCa
02-06-2010, 15:37:52
Hola a todos
Sera porque lo he usado muy poco, y cuando lo he hecho es en procedimientos ya elaborados, pero aun no entiendo el funcionamiento de inherited y override :confused:

Me podrian explicar que hace cada uno, y en que situación es cuando se deben emplear?

Faust
02-06-2010, 17:14:32
Yo tampoco los he usado mucho, de hecho solo últimamente y te comento según mi experiencia:

inherited lo he usado cuando creo descendientes de objetos, ¿qué hace exactamente? cuando creo un descendiente p. ejemplo. de un TThread y requiero que tenga funcionalidad más allá de la clase TThread, por lo que es posible que requiera de un objeto extra auxiliar, p. ej. un TList.


interface

type
TMyThread = class(TThread)
private
{ Private declarations }
FMaxProcs: Integer;
FDelay: Integer;
FProcList: TList;
public
constructor Create(Delay, MaxProcs: Integer; AppHandle: THandle); reintroduce; overload;
destructor Destroy; override;
procedure KillMe;
protected
procedure Execute; override;
end;

...
...
...

implementation

constructor TMyThread.Create(Delay, MaxProcs: Integer; AppHandle: THandle);
begin
inherited Create(True);
FProcsLst:= TList.Create;
...
FDelay:= Delay;
FMaxProcs:= MaxProcs;
FAppHandle:= AppHandle;
Resume
end;



Sobrecargo el Create original del TThread indícándolo con la directiva overload en interface, redefino Create en implementation y la primera línea que pongo es inherited Create(False), lo que hace es heredar o llamar al procedimiento original Create de la clase donde incluso puedo poner parámetros, si pongo solamente inherited, el compilador asume que llamo o heredo el procedimiento del mismo nombre en el que está, despues de crear el objeto ahora si seteo algunas propiedades o hago lo que yo quiera.

En cuanto a override anula el procedimiento de la clase que heredo y lo sobreescribe, en el ejemplo anterior tengo en la definición de la clase Destroy declarado así:

destructor Destroy; override;

Lo que hago es que el método Destroy de TThread ya no lo puedo usar, pero lo sobreescribo, en implementation tengo esto:

destructor TMyThread.Destroy;
begin
FProcsLst.Free;
inherited
end;


Ahora es como si intercambiara el método TThread.Destroy por TMyThread.Destroy, libero el TList que he estado usando y vuelvo a llamar inherited solito, inherited manda a llamar o ejecuta el Destroy de TThread.

Bueno, eso es lo poco que sé, pero si tienes alguna duda tal vez yo u otro compañero del for te ayudaremos.

Saludos