Conoce300 __ Pascal Con Free Pascal __ Introducción a La Programación Orientada a Objetos I __...

5
15/10/2015 Conoce300 :: Pascal con Free Pascal :: Introducción a la programación orientada a objetos I :: Constructores y Destructores http://www.conoce3000.com/html/espaniol/Libros/PascalConFreePascal/Cap1003Constructores%20y%20Destructores.php 1/5 PASCAL CON FREE PASCAL 10. Introducción a la programación orientada a objetos I. 10.3. Constructores y Destructores. anterior :: indice :: siguiente 10.1. ¿Qué es la programación Orientada a Objetos?. 10.2. Un programa de ejemplo. 10.3. Constructores y Destructores. 10.4. Sobrecarga de métodos Polimorfismo por sobrecarga. 10.5. Herencia Polimorfismo por sobreescritura Compatibilidad entre objetos. 10.6. Encapsulación (Private, Strict private, Protected, Strict Protected, Public). 10.7. Polimorfismo por sobreescritura con enlace posterior. 10.8. Parametros opcionales y uso de self. 10.9. Preguntas y ejercicios. 10.10. Respuesta a las preguntas y ejercicios. Los constructores son los métodos que se encargan de crear un objeto en el montículo, y los destructores son los métodos que se encargan de retirarlos del montículo. Al momento de crear un objeto de una determinada clase, para ejecutar el constructor correspondiente, se hace referencia con la clase y no con el objeto que se quiere crear. Esto debido a que el constructor es el encargado de crear el objeto en el montículo. Todas las clases tienen un constructor predefinido llamado Create , este como ya explique se encarga de crear el objeto en el montículo, pero también se encarga de inicializar todos los atributos automáticamente con ceros. De este modo si los atributos son números enteros o reales tendrán el valor 0, si son del tipo boolean tendrán el valor false, si es una cadena de caracteres tendrá una cadena de caracteres vacía, si es un carácter tendrá el carácter nulo, si es de tipo enumerado tendrá el valor inicial, siempre y cuando no se haya cambiado la enumeración de los tipos enumerados (es decir siempre deben comenzar en cero), y en el caso de los conjuntos tendrán un conjunto vació. Cada vez que se crea un objeto, es preciso destruirlo. Si no se hace, la memoria utilizada en el montículo por el objeto no estará disponible para otro objeto, hasta que se finalice el programa. Nuestras clases, pueden tener sus propios constructores, para ello se hace uso de la palabra reservada constructor. La declaración de un constructor se hace después de los atributos de una clase, en caso contrario el compilador generará un error de compilación. Un constructor también se puede utilizar para iniciar los atributos a un determinado valor, por ejemplo , a la clase TComplejos se le puede añadir un constructor para crear un número complejo con sus valores real e imaginario, sin usar los métodos PonReal y PonImag. Ejemplo: {$codepage utf8} {$mode objfpc} UNIT Complejos; INTERFACE TYPE TComplejo = CLASS ParteReal,ParteImag:double; CONSTRUCTOR Crear(r,i:double); FUNCTION ObtReal:double; FUNCTION ObtImag:double; PROCEDURE PonReal(n:double); PROCEDURE PonImag(n:double); FUNCTION ObtCad(dec:integer):string; FUNCTION PonCad(n:string):integer; PROCEDURE Adicion(n:TComplejo); PROCEDURE Multiplicacion(n:TComplejo); END; IMPLEMENTATION CONSTRUCTOR TComplejo.Crear(r,i:double); BEGIN ParteReal:=r; ParteImag:=i; END; LENGUAJES DE PROGRAMACIÓN Trabajo: Arca Continental Accede a sus ofertas de empleo. Checa las vacantes y postúlate.

description

b,bmb ,mb

Transcript of Conoce300 __ Pascal Con Free Pascal __ Introducción a La Programación Orientada a Objetos I __...

Page 1: Conoce300 __ Pascal Con Free Pascal __ Introducción a La Programación Orientada a Objetos I __ Constructores y Destructores

15/10/2015 Conoce300 :: Pascal con Free Pascal :: Introducción a la programación orientada a objetos I :: Constructores y Destructores

http://www.conoce3000.com/html/espaniol/Libros/PascalConFreePascal/Cap1003Constructores%20y%20Destructores.php 1/5

PASCAL CON FREE PASCAL

10. Introducción a la programación orientada a objetos I.

10.3. Constructores y Destructores. anterior :: indice :: siguiente 10.1. ¿Qué es la programación Orientada aObjetos?.10.2. Un programa de ejemplo.10.3. Constructores y Destructores.10.4. Sobrecarga de métodos Polimorfismo porsobrecarga.

10.5. Herencia Polimorfismo por sobreescritura Compatibilidad entre objetos.10.6. Encapsulación (Private, Strict private,Protected, Strict Protected, Public).10.7. Polimorfismo por sobreescritura con enlaceposterior.

10.8. Parametros opcionales y uso de self.10.9. Preguntas y ejercicios.10.10. Respuesta a las preguntas y ejercicios.

Los constructores son los métodos que se encargan de crear un objeto en el montículo, y los destructores son los métodos que seencargan de retirarlos del montículo. Al momento de crear un objeto de una determinada clase, para ejecutar el constructorcorrespondiente, se hace referencia con la clase y no con el objeto que se quiere crear. Esto debido a que el constructor es elencargado de crear el objeto en el montículo. Todas las clases tienen un constructor predefinido llamado Create, este como yaexplique se encarga de crear el objeto en el montículo, pero también se encarga de inicializar todos los atributos automáticamentecon ceros. De este modo si los atributos son números enteros o reales tendrán el valor 0, si son del tipo boolean tendrán el valorfalse, si es una cadena de caracteres tendrá una cadena de caracteres vacía, si es un carácter tendrá el carácter nulo, si es detipo enumerado tendrá el valor inicial, siempre y cuando no se haya cambiado la enumeración de los tipos enumerados (es decirsiempre deben comenzar en cero), y en el caso de los conjuntos tendrán un conjunto vació.Cada vez que se crea un objeto, es preciso destruirlo. Si no se hace, la memoria utilizada en el montículo por el objeto no estarádisponible para otro objeto, hasta que se finalice el programa.Nuestras clases, pueden tener sus propios constructores, para ello se hace uso de la palabra reservada constructor. Ladeclaración de un constructor se hace después de los atributos de una clase, en caso contrario el compilador generará un error decompilación. Un constructor también se puede utilizar para iniciar los atributos a un determinado valor, por ejemplo, a la claseTComplejos se le puede añadir un constructor para crear un número complejo con sus valores real e imaginario, sin usar losmétodos PonReal y PonImag. Ejemplo:

$codepage utf8$mode objfpc

UNIT Complejos;INTERFACE

TYPE TComplejo = CLASS ParteReal,ParteImag:double; CONSTRUCTOR Crear(r,i:double); FUNCTION ObtReal:double; FUNCTION ObtImag:double; PROCEDURE PonReal(n:double); PROCEDURE PonImag(n:double); FUNCTION ObtCad(dec:integer):string; FUNCTION PonCad(n:string):integer; PROCEDURE Adicion(n:TComplejo); PROCEDURE Multiplicacion(n:TComplejo); END;

IMPLEMENTATION

CONSTRUCTOR TComplejo.Crear(r,i:double); BEGIN ParteReal:=r; ParteImag:=i; END;

LENGUAJES DE PROGRAMACIÓN

Trabajo: Arca ContinentalAccede a sus ofertas de empleo.Checa las vacantes y postúlate.

Page 2: Conoce300 __ Pascal Con Free Pascal __ Introducción a La Programación Orientada a Objetos I __ Constructores y Destructores

15/10/2015 Conoce300 :: Pascal con Free Pascal :: Introducción a la programación orientada a objetos I :: Constructores y Destructores

http://www.conoce3000.com/html/espaniol/Libros/PascalConFreePascal/Cap1003Constructores%20y%20Destructores.php 2/5

FUNCTION TComplejo.ObtReal:double; BEGIN ObtReal:=ParteReal END;

FUNCTION TComplejo.ObtImag:double; BEGIN ObtImag:=ParteImag END;

PROCEDURE TComplejo.PonReal(n:double); BEGIN ParteReal:=n; END;

PROCEDURE TComplejo.PonImag(n:double); BEGIN ParteImag:=n END;

FUNCTION TComplejo.ObtCad(dec:integer):string; VAR aux1,aux2,p:string; BEGIN p:=''; Str(ParteReal:0:dec,aux1); Str(ParteImag:0:dec,aux2); IF ParteImag>=0 THEN p:='+'; ObtCad := aux1 + p + aux2 + 'i'; END;

FUNCTION TComplejo.PonCad(n:string):integer; VAR aux:string; p,i,error:integer; PR,PI:string; encontro:boolean; BEGIN aux:=n; ParteReal:=0; ParteImag:=0; error:=0; IF (aux[length(aux)]='i') AND (NOT(aux[length(aux)‐1]IN['0'..'9'])) THEN aux:=Copy(aux,1,length(aux)‐1)+'1i'; IF aux[length(aux)]='i' THEN BEGIN delete(aux,length(aux),1); IF aux[length(aux)] IN ['0'..'9'] THEN BEGIN i:=length(aux); encontro:=FALSE; p:=0; WHILE (NOT encontro) AND (i>1) DO BEGIN IF (aux[i]='+') OR (aux[i]='‐') THEN BEGIN encontro:=TRUE; p:=i END; i:=i‐1 END; PR:=Copy(aux,1,p‐1); delete(aux,1,p‐1); PI:=aux; Val(PR,ParteReal,error); Val(PI,ParteImag,error); IF error<>0 THEN BEGIN ParteReal:=0; ParteImag:=0 END END; END ELSE BEGIN Val(aux,ParteReal,error); END; PonCad:=error END;

PROCEDURE TComplejo.Adicion(n:TComplejo); BEGIN PonReal(ObtReal+n.ObtReal); PonImag(ObtImag+n.ObtImag) END;

PROCEDURE TComplejo.Multiplicacion(n:TComplejo); VAR PR,PI:double; BEGIN PR:=(ObtReal*n.ObtReal)‐(ObtImag*n.ObtImag); PI:=(ObtReal*n.ObtImag)+(ObtImag*n.ObtReal); PonReal(PR); PonImag(PI) END;

END.

Page 3: Conoce300 __ Pascal Con Free Pascal __ Introducción a La Programación Orientada a Objetos I __ Constructores y Destructores

15/10/2015 Conoce300 :: Pascal con Free Pascal :: Introducción a la programación orientada a objetos I :: Constructores y Destructores

http://www.conoce3000.com/html/espaniol/Libros/PascalConFreePascal/Cap1003Constructores%20y%20Destructores.php 3/5

Código fuente 3: Unidad Complejos con el constructor Crear. Ahora el programa SumMul.pp, sólo usará los constructores para crear los números complejos. Ejemplo:

$codepage utf8$mode objfpcUSES Complejos;VAR Numero01,Numero02,Resultado:TComplejo; BEGIN Numero01:=TComplejo.Crear(3,5); Numero02:=TComplejo.Crear(5,2); Resultado:=TComplejo.Create; Resultado.Crear(Numero01.ObtReal,Numero01.ObtImag); Resultado.Adicion(Numero02); Writeln(Resultado.ObtCad(0));

Resultado.Crear(Numero01.ObtReal,Numero01.ObtImag); Resultado.Multiplicacion(Numero02); Writeln(Resultado.ObtCad(0))END.

Código fuente 4: Programa SumMul usando el constructor crear. Cómo se puede observar en el programa SumMul.pp, el objeto Resultado usa el constructor crear, para colocar la parte real eimaginaria del primer número complejo, antes de sumarlo o multiplicarlo. También se puede utilizar el constructor sobre un objetoya creado; en ese caso no se crea un objeto en el montículo, pues ya existe, pero sin embrago se ejecutan las instrucciones delconstructor. Es decir, si más adelante en el programa SumMul.pp, hacemos lo siguiente:

Numero01:=TComplejo.Crear(3,5);.....Numero01.Crear(8,5)

Numero01, tendrá el número complejo 8+5i, y no con el que se ha creado 3+5i. Hay que tener cuidado con el uso de esta técnica,ya que si el objeto no ha sido creado, se produce un error en tiempo de ejecución. Es decir si no se hubiese creado el objetoNumero01, y se ejecutan las siguientes instrucciones:

Numero01.Crear(8,5);Writeln(Numero01.ObtCad(0))

Se producirá un error en tiempo de ejecución, por el uso del método ObtCad, que hace referencia a un objeto que no se ha creado.Todas las clases también tienen un destructor predefinido llamado Destroy. Para la implementación de un destructor propio parauna clase, se procede de modo similar a la implementación de los constructores, excepto que la palabra reservada constructor sesustituye por la palabra reservada destructor, pero en una clase sólo debe haber un destructor y este no debe tener parámetros.Las instrucciones definidas en el destructor se ejecutan justo antes de liberar la memoria usada por el objeto.El uso de los destructores dependerá de las circunstancias del programa, en el programa SumMul, en ningún momento sedestruyen los objetos Numero01, Numero02 y resultado, ya que no es necesario, debido a la naturaleza del programa que essecuencial. Es decir todo objeto que se cree en un programa será destruido cuando el programa finalice.Pero existen circunstancias en la que es necesario destruir el objeto, para que este no ocupe espacio de memoria en el montículo.A modo de ejemplo he creado el siguiente programa, en donde se hace uso de un procedimiento que permite intercambiar dosnúmeros complejos. El procedimiento usa un objeto aux, de la clase de TComplejo, que se crea dentro del procedimiento. Lavariable aux al ser un puntero, contiene una dirección de memoria al objeto que se crea en el montículo, cuando el procedimientotermina, la variable aux se borra de la pila, y si el objeto no es destruido entonces este existirá de manera inaccesible en elmontículo, ocupando espacio que se puede aprovechar por otro objeto. Es en esta circunstancia cuando es necesario eliminar elobjeto. A continuación el programa de ejemplo, este hace uso de la unidad Complejos.pp. Ejemplo:

$codepage utf8$mode objfpcUSES Complejos;VAR A,B:TComplejo;

PROCEDURE Intercambio(A,B:TComplejo);VAR aux:TComplejo;BEGIN aux:=TComplejo.crear(A.ObtReal,A.ObtImag); A.crear(B.ObtReal,B.ObtImag); B.crear(aux.ObtReal,aux.ObtImag); aux.destroy; aux:=NIL;END;

BEGIN A:=TComplejo.Crear(10,4); B:=TComplejo.Crear(0,1); Writeln('A=',A.ObtCad(0)); Writeln('B=',B.ObtCad(0)); Intercambio(A,B); Writeln('A=',A.ObtCad(0)); Writeln('B=',B.ObtCad(0))

Page 4: Conoce300 __ Pascal Con Free Pascal __ Introducción a La Programación Orientada a Objetos I __ Constructores y Destructores

15/10/2015 Conoce300 :: Pascal con Free Pascal :: Introducción a la programación orientada a objetos I :: Constructores y Destructores

http://www.conoce3000.com/html/espaniol/Libros/PascalConFreePascal/Cap1003Constructores%20y%20Destructores.php 4/5

END.

Código fuente 5: Uso de destroy. Después de llamar al destructor se recomienda poner a nil la variable aux, para indicar que el objeto se ha eliminado. En este casono es necesario pero es bueno mantener esta práctica.Cuando un programa es demasiado complejo, suele suceder situaciones en la que no se puede saber anticipadamente si un objetoha sido destruido en otra parte del código, con lo que puede suceder que se ejecute el método destroy por segunda vezocasionando un error en tiempo de ejecución. Por lo que se recomienda en vez de usar el destructor destroy, usar el método free,que es un método, que por defecto lo tienen todas las clases en freepascal. Este método se encarga de verificar si realmente seelimino el objeto del montículo, comprobando si el objeto tiene el valor nil, en caso no se haya eliminado entonces este métodoejecutará el destructor destroy, eliminando al objeto del montículo. Después de usar free, se debe colocar el objeto a nil, paraindicar que este se ha eliminado y de ese modo cuando en otra parte del código se vuelve a usar otra vez el método free, esteevitará usar el destructor del objeto que ya se ha destruido.Ejemplo:

$codepage utf8$mode objfpcUSES Complejos;VAR A,B:TComplejo;

PROCEDURE Intercambio(A,B:TComplejo);VAR aux:TComplejo;BEGIN aux:=TComplejo.crear(A.ObtReal,A.ObtImag); A.crear(B.ObtReal,B.ObtImag); B.crear(aux.ObtReal,aux.ObtImag); aux.free; aux:=NIL;END;

BEGIN A:=TComplejo.Crear(10,4); B:=TComplejo.Crear(0,1); Writeln('A=',A.ObtCad(0)); Writeln('B=',B.ObtCad(0)); Intercambio(A,B); Writeln('A=',A.ObtCad(0)); Writeln('B=',B.ObtCad(0))END.

Código fuente 6: Uso de free. Aunque se pueden crear destructores con un nombre propio o mejor dicho diferente a destroy, no es recomendable hacerlo si seusa el método free, ya que este ejecuta el destructor que tienen como nombre destroy y no ejecutará el definido por el usuario. Última revisión: 16/06/2013.

Tweet 0

anterior :: indice :: siguiente

SUGERENCIAS

0Recomendar

Page 5: Conoce300 __ Pascal Con Free Pascal __ Introducción a La Programación Orientada a Objetos I __ Constructores y Destructores

15/10/2015 Conoce300 :: Pascal con Free Pascal :: Introducción a la programación orientada a objetos I :: Constructores y Destructores

http://www.conoce3000.com/html/espaniol/Libros/PascalConFreePascal/Cap1003Constructores%20y%20Destructores.php 5/5

"Agradezco que se tomen su tiempo, para escribirme una sugerencia. Toda sugerencia que meescriba me ayuda a mejorar los contenidos de la web acorde a sus necesidades. Las sugerencias, serecibirán siempre y cuando ingrese al menos su nombre o seudónimo y la sugerencia. Lassugerencias son de uso interno y no serán publicadas en la web Conoce3000" Nombre o seudónimo :

Correo Electrónico :

Sugerencias :

Deseo recibir una copia del mensaje. Enviar

PORTADA | LIBROS | APUNTES | ARTÍCULOS

Todos los textos, imágenes y videos de Conoce3000 estan colocados bajo una licencia :Creative Commons ReconocimientoNoComercial 3.0 Unported License.