Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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:
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:
6. 7. 8.
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.
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
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
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!
Delphius
Administrador
Mensajes: 3,794 Calificaciones: +332/-2 Sexo: El polimorfismo seguir siendo parte de mi vida?
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
Mensajes: 3,794 Calificaciones: +332/-2 Sexo: El polimorfismo seguir siendo parte de mi vida?
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,
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;
Cdigo DELPHI 1. constructor TPerro.CrearConNombre(Nombre: string); 2. begin 3. inherited Create; 4. FNombre := Nombre; 5. end;
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:
Las mismas reglas que se aplican a cualquier otro mtodo son vlidas para el constructor.
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:
Saludos,
ltima modificacin: 08 de Enero de 2009, 12:25:58 por Delphius En lnea
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 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
Buenas,
Por supuesto tambin puedes hacer la negacin si slo quieres saber si no existe
Cdigo DELPHI
Nos leemos
En lnea Salu2 cadetill
memofer
Usuario Activo
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
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}
cadetill
Moderadores
Perdn, eso me pasa por hacer las cosas de memoria jejejeje No es Assign, sino Assigned, por lo que sera
Nos leemos
En lnea Salu2 cadetill
Delphius
Administrador
Mensajes: 3,794 Calificaciones: +332/-2 Sexo: El polimorfismo seguir siendo parte de mi vida?
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:
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]