Está en la página 1de 19

CONSTRUCTORES EN DELPHI

Cdigo DELPHI 1. Objeto := TObjecto.Create;

Y con ello ya tiene en memoria una instancia de dicha clase. Create es el constructor y se encarga de inicializar algunos o todos los atributos del objeto una vez que se ha reservado la memoria. Luego cuando ya no es necesario el objeto, simplemente se lo libera de memoria:

Cdigo DELPHI 1. Objeto.Free;

El mtodo Free enva el mensaje Destroy y ste ltimo se encarga de liberar la memoria. Destroy es el destructor.

Un constructor y destructor no es ms que otro mtodo, con la salvedad en que en vez de definirlo como procedimiento o funcin se emplean las palabras "constructor" y "destructor" respectivamente. Por ejemplo:

Cdigo DELPHI 1. type 2. TPerro = class(TMamifero) 3. ... 4. public 5. ...

6. 7. 8.

constructor Create; destructor Destroy; override; end;

Luego en su implementacin se ve algo como esto:

Cdigo DELPHI 1. constructor TPerro.Create; 2. begin 3. inherited Create; 4. // algunas inicializaciones 5. end; 6. 7. destructor TPerro.Destroy; 8. begin 9. // algunas operaciones de inters y liberaciones de objetos dependientes 10. inherited Destroy; 11. end;

Como puede apreciarse, a Destroy le he aadido la clsula override. Es fundamental declararla puesto que el constructor Destroy es virtual en TObject. En este ejemplo es redundante tanto el constructor como el destructor ya que el mismo constructor y Destructor de la clase TObject se encarga de la administracin de memoria de los mtodos simples. Y adems, se ve que intenamente se invoca al constructor y destructor de la clase TObject, al establecer la clsula inherited. Esto es necesario para que el constructor y destructor que definimos funcione apropiadamente. De ste modo nos garantizamos de que se inicializan los valores que se necesiten o se heredan desde TObject.

Cuando debemos declarar constructores y destructores?

Es necesario cuando entre los atributos, o internamente como alguna variable ms, contamos con tipos complejos que requieren de manejo de memoria en forma explcita. Es decir cuando es nuestra responsabilidad manejar el uso de memoria. Por mencionar dos ejemplos: cuando un atributo es una clase o un array dinmico.

Por poner algo ms visual. Digamos que queremos que nuestro TPerro tenga la habilidad de criar y mantener a sus cras (obviemos el tema semntico por el momento). Para tener referencia de sus cras podemos hacer uso de TObjectList. De este modo se concibe esta idea:

Cdigo DELPHI 1. type 2. TPerro = class 3. private 4. ListaCrias: TObjectList; 5. ... 6. public 7. ... 8. constructor Create; 9. destructor Destroy override; 10. end;

Como tenemos una clase definida, e internamente vamos a hacer uso de ella. Create es un mtodo candidato (no necesariamente debe ser aqu donde se crea. Depende de diseo y propsitos) para crearla:

Cdigo DELPHI 1. constructor TPerro.Create; 2. begin 3. inherited Create; 4. ... 5. FListaCrias := TObjectList.Create; 6. ... 7. end; 8. 9. destructor TPerro.Destroy; 10. begin 11. ... 12. FListaCrrias.Clear; 13. FListaCrias.Free; 14. ... 15. inherited Destroy; 16. end;

Como puede apreciarse reservamos la memoria en Create y la liberamos en Destroy. Continuaremos hablando del tema en otro post.
Miembros agradecidos: esocrates En ste post, 1 usuario di gracias!

Twittear digg

En lnea Como redactar mensajes - Uso de etiquetas

Se ensea por amor a los dems, se aprende por amor a la verdad Cuanto ms se busca la verdad, sin llegar a la perfeccin, anhelamos saber lo que falta San Agustn

Rolphy Reyes

Moderadores

Gracias -Dados: 206 -Recibidos: 275

Mensajes: 1,691 Calificaciones: +289/-0 Sexo: TRolphyReyes = Class(TBaseModerador)

Re: Concepto: constructores y destructores


Respuesta #1 en: 08 de Enero de 2009, 10:56:42

Saludos.

Estos temas de OOP me fascinan, desde que los vi he estado tratando de comprenderlos, porque en realidad disminuye el cdigo.

Tocando el tema, espero que en las prximas presentaciones comentes sobre Class Function y Class Procedure, que en un sentido pueden pasarse como

Constructores.

Otra cosa pienso que te falto mencionar la directiva reintroduce en el constructor, agregada por Borland a partir de la versin 5 para callar al compilador.
En lnea Lo nico predecible en la vida es lo impredecible!

Si encontr til este Mensaje utilice el Botn de Gracias.

Cmo postear correctamente?

Delphius

Administrador

Gracias -Dados: 201 -Recibidos: 297

Mensajes: 3,794 Calificaciones: +332/-2 Sexo: El polimorfismo seguir siendo parte de mi vida?

Re: Concepto: constructores y destructores


Respuesta #2 en: 08 de Enero de 2009, 11:11:42

Cita de: RolphyReyes en 08 de Enero de 2009, 10:56:42 Saludos. Estos temas de OOP me fascinan, desde que los vi he estado tratando de comprenderlos, porque en realidad disminuye el cdigo. Tocando el tema, espero que en las prximas presentaciones comentes sobre Class Function y Class Procedure, que en un sentido pueden pasarse como Constructores. Otra cosa pienso que te falto mencionar la directiva reintroduce en el constructor, agregada por Borland a partir de la versin 5 para callar al compilador.
Hola RolphyReyes, Tengo pensado hacerlo, aunque no te sabra decir cuando. En la medida en que puedo sacar tiempo, y ordenar ideas, voy llevando estos tutoriales. Por otro lado, por el tema de reintroduce, no estoy totalmente familiarizado con el concepto. Por lo poco que comprendo, se debe emplear reintroduce cuando se desea sobrecargar un mtodo virtual de una clase base. Sera bueno que aportaras ms sobre este concepto, a modo de ilustrar a los interesados (yo includo).

Este tutorial no termina con el anterior post. Tengo pensado continuar un poquito ms al tema.

Saludos,
En lnea Como redactar mensajes - Uso de etiquetas

Se ensea por amor a los dems, se aprende por amor a la verdad Cuanto ms se busca la verdad, sin llegar a la perfeccin, anhelamos saber lo que falta San Agustn

Delphius

Administrador

Gracias -Dados: 201 -Recibidos: 297

Mensajes: 3,794 Calificaciones: +332/-2 Sexo: El polimorfismo seguir siendo parte de mi vida?

Re: Concepto: constructores y destructores


Respuesta #3 en: 08 de Enero de 2009, 12:23:49

Varios Constructores

Habr notado que cuando uno desea crear un componente en tiempo de ejecucin. el constructor le indica que espera un parmetro. Porqu TPerro y otros ejemplos tratado hasta ahora no tenan que declararlo?

Porque simplemente, nuestros ejemplos estn basados en la clase TObject y en sta el constructor Create no espera parmetro alguno. En cambio la clase TComponent ofrece otro constructor monoparamtrico en el cual se debe indicar el objeto dueo del componente que estamos creando. Por ello es que cuando uno desea crear cualquier objeto que descienda de la clase TComponent debe indicar este parmetro.

La realidad es que podemos definir ms de un constructor. Cada uno con una implementacin diferente, que puede recibir o no parmetros. Por ejemplo,

supongamos que deseamos crear un perro, e iniciarle un nombre de entrada.

Podemos concebir a TPerro del siguiente modo:

Cdigo DELPHI 1. TPerro = class 2. private 3. FNombre: string; 4. public 5. constructor Create; 6. constructor CrearConNombre(Nombre: string); 7. destructor Destroy; override; 8. property Nombre: string read FNombre; 9. end;

Y el nuevo constructor podra ser como el que sigue:

Cdigo DELPHI 1. constructor TPerro.CrearConNombre(Nombre: string); 2. begin 3. inherited Create; 4. FNombre := Nombre; 5. end;

Ahora pruebe el siguiente cdigo:

Cdigo DELPHI 1. procedure TForm1.Button1Click(Sender: TObject); 2. var Perro: TPerro; 3. begin 4. Perro := TPerro.CrearConNombre('Marcelo'); 5. ShowMessage(Perro.Nombre); 6. FreeAndNil(Perro); 7. 8. Perro := TPerro.Create; 9. ShowMessage(Perro.Nombre); 10. FreeAndNil(Perro); 11. end;

Deber recibir dos cuadros de dilogo. El primero con el texto "Marcelo" y el segundo con el nombe "Fido". De igual modo es permisible sobrecargar el constructor de ste modo:

Cdigo DELPHI 1. constructor Create; overload; 2. constructor Create(Nombre: string); overload;

Las mismas reglas que se aplican a cualquier otro mtodo son vlidas para el constructor.

Porqu Free y no directamente Destroy?

Uno puede pensar que si Destroy es quien libera la memoria porqu no usarlo de forma directa? El motivo, Free es un medio seguro, ya que realiza un chequeo de ltimo momento: analiza si el objeto en realidad existe.

Cdigo DELPHI 1. procedure TObject.Free; 2. begin 3. if Self <> nil then 4. Destroy; 5. end;

Es decir, que antes de liberar la memoria se comprueba de que exista algo por liberar. Supongase de que no existiera el mtodo Free, y debemos hacer uso de Destroy. Ahora altere el ltimo ejemplo con este:

Cdigo DELPHI 1. 2. 3. 4. 5. 6. 7. 8. 9. Perro := TPerro.Create('Marcelo'); ShowMessage(Perro.Nombre); FreeAndNil(Perro); Perro := TPerro.Create; ShowMessage(Perro.Nombre); FreeAndNil(Perro); Perro.Destroy;

Al finalizar toda la rutina debera recibir una excepcin EAccessViolation. Porqu? Porque se est intentando eliminar algo que ya fue eliminado. Con Free no se recibe dicha violacin, Free es garanta de que si el objeto existiese se lo libere, en otro caso no realiza nada. En tiempo de diseo no vemos que se est liberando dos veces... siempre puede haber un margen al error y por ello se aconseja muchsimo Free por sobre Destroy. Este ejemplo es sencillo, y tal vez pueda omitirse el Free y valernos de Destroy en forma directa. Pero imagine un cdigo sumamente complejo, en donde intervienen muchas clases, y muchas relaciones. La mejor forma de garantizar de que el objeto sea liberado es emplear Free. De igual forma tambin debe ser considerado en cuenta que una vez liberado no se haga el intento de seguir empleandolo.

Si usted puede garantizar que siempre se liberar, y que luego no habr referencia alguna sobre el objeto. Puede hacer uso directo de Free. Ms no es algo muy deseable confiarse.

Como observacin, puede notar que se llama al mtodo Destroy. Si nuestra clase implementa uno (y por tanto que redefine al de TObject) se har uso de dicho constructor, en otro caso de invoca al de TObject. Por esto es que se aconseja mucho redefinir el destructor que ya ofrece TObject, en vez de estar declarando uno propio. Como por ejemplo:

Cdigo DELPHI 1. 2. 3. 4. 5. TPerro = class public ... destructor Destruir; end;

Saludos,
ltima modificacin: 08 de Enero de 2009, 12:25:58 por Delphius En lnea

Como redactar mensajes - Uso de etiquetas

Se ensea por amor a los dems, se aprende por amor a la verdad Cuanto ms se busca la verdad, sin llegar a la perfeccin, anhelamos saber lo que falta San Agustn

memofer

Usuario Activo

Gracias -Dados: 2 -Recibidos: 0

Mensajes: 21 Calificaciones: +0/-0 Sexo: Aprendiendo dia a dia

Re:Concepto: constructores y destructores


Respuesta #4 en: 12 de Febrero de 2013, 23:44:42

Gracias por tus excelente explicaciones, me ayudan a entender mas todo este conecpto de destruir y construir. Solo quisiera saber si tienes algun tip para saber si un objeto ya fue destruido o no?
En lnea Crei no tener nada, pero al descubrir la Esperanza, supe que lo tenia todo.

cadetill

Moderadores

Gracias -Dados: 97 -Recibidos: 175

Mensajes: 803 Calificaciones: +181/-0 Sexo:

Re:Concepto: constructores y destructores


Respuesta #5 en: 13 de Febrero de 2013, 01:46:34

Buenas,

Para saber de la existencia (o no) de un objeto tienes la funcin Assign

Cdigo DELPHI 1. if Assign(MiObjecto) then // el objeto existe 2. else // el objeto no existe

Por supuesto tambin puedes hacer la negacin si slo quieres saber si no existe

Cdigo DELPHI

1. if not Assign(MiObjecto) then // el objeto no existe

Nos leemos
En lnea Salu2 cadetill

memofer

Usuario Activo

Gracias -Dados: 2 -Recibidos: 0

Mensajes: 21 Calificaciones: +0/-0 Sexo: Aprendiendo dia a dia

Re:Concepto: constructores y destructores


Respuesta #6 en: 13 de Febrero de 2013, 10:39:39

Cadetill

En mi caso, estoy usando RAD Studio XE2 y la funcion Assign(MiObjeto) no me lo identifica como valor booleano osea que con el

Cdigo DELPHI 1. if Assign(MiObjeto) then 2. ...


no me lo reconoce y verificando la sintaxis de Assign() me dice esto:

Delphi procedure Assign(Source: TPersistent); virtual; Description Copies the contents of another similar object. Call Assign to copy the properties or other attributes of one object from another. The standard form of a call to Assign is: Destination.Assign(Source); {Delphi}

No se si tuvieras algun otro tip o consejo. Gracias.


En lnea Crei no tener nada, pero al descubrir la Esperanza, supe que lo tenia todo.

cadetill

Moderadores

Gracias -Dados: 97 -Recibidos: 175

Mensajes: 803 Calificaciones: +181/-0 Sexo:

Re:Concepto: constructores y destructores


Respuesta #7 en: 13 de Febrero de 2013, 11:40:07

Perdn, eso me pasa por hacer las cosas de memoria jejejeje No es Assign, sino Assigned, por lo que sera

Cdigo DELPHI 1. if Assigned(MiObjecto) then // el objeto existe

Nos leemos
En lnea Salu2 cadetill

Delphius

Administrador

Gracias -Dados: 201 -Recibidos: 297

Mensajes: 3,794 Calificaciones: +332/-2 Sexo: El polimorfismo seguir siendo parte de mi vida?

Re:Concepto: constructores y destructores


Respuesta #8 en: 13 de Febrero de 2013, 21:10:04

Hola, Lamento no haber estado antes para responderte. Estoy con pocos tiempos. Como te han indicado, lo aconsejable es emplear Assigned. Cuya implementacin no es ms que un if evaluando si el objeto es nil. Es decir, algo como:

Cdigo DELPHI 1. result := Objeto <> nil;

Entonces el resultado ser true para cuando el objeto sea distinto a nulo, y falso en caso contrario.

Saludos,
En lnea Como redactar mensajes - Uso de etiquetas

Se ensea por amor a los dems, se aprende por amor a la verdad Cuanto ms se busca la verdad, sin llegar a la perfeccin, anhelamos saber lo que falta San Agustn

IMPRIMIR

Pginas: [1]

Ir Arriba anterior prximo

También podría gustarte