BotonMenu
BotonIndice

Visita : http://www.conoce3000.com
Paypal : https://www.paypal.me/conoce3000/1

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL


11. INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS II.
11.2. PROPIEDADES.
11. INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS II.
11.2. PROPIEDADES.
11. INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS II.
11.2. PROPIEDADES.

SIGUIENTE

SIGUIENTE

SIGUIENTE


‒ Propiedades

Las propiedades actúan de manera similar a los atributos, pero con la diferencia de que el valor asignado a este atributo, es asociado a un método que puede ser una función o procedimiento.

La palabra reservada property, se usa para definir la propiedad, y seguido se coloca su identificador, con el tipo de dato correspondiente, a continuación se especifican los métodos asociados que son una función para la lectura de los valores de la propiedad y un procedimiento para la escritura.

La función que se usa para la lectura de una propiedad, no debe tener parámetros y debe devolver un valor del mismo tipo de dato de la propiedad, y el procedimiento para la escritura debe tener sólo un parámetro, en donde cuyo parámetro debe ser del mismo tipo de la propiedad.

Para explicar el uso de propiedades se usará la unidad Complejos08.pp, que contiene la definición de la clase TComplejo. Esta unidad, es una versión diferente a la vista en el capítulo anterior. A esta clase TComplejo, se le añadió el atributo decimales, que sirve para indicar con cuantos decimales se representarán, la parte real e imaginaria del número, y además al constructor crear de esta clase se le añadió un tercer parámetro opcional, para poder crear el número complejo, con los decimales que uno desee usar. Otros cambios que se hicieron a esta unidad tienen que ver con las propiedades que se explican a continuación.

Las propiedades siempre se deben crear en la sección publica de una clase (public), no obstante sus métodos se deben implementar en la sección privada de la clase. Aunque el compilador permite implementar los métodos de una propiedad, en cualquier parte de la clase, esto en realidad no es lo recomendado, ya que se tendría dos maneras de trabajar con las clase, cuando en realidad sólo se necesita de una. Por ejemplo la siguiente propiedad:

   Property CompCad:string read ObtCompCad write PonCompCad;

que pertenece a la clase TComplejo (ver la unidad Complejos.pp), hace uso de las funcion ObtCompCad y del procedimiento PonComCad, estos métodos se implementan en la sección privada de la clase. Las palabras reservadas read y write, nos sirven para indicar que método se usará para lectura o escritura de la propiedad. Una de las cosas que se debe tener presente, es que este no es exactamente igual a un atributo, ya que una propiedad es una referencia que se usará, con una función o un procedimiento. Esto hace que la propiedad, no se pueda usar con métodos o cualquier otra rutina, que usen parámetros por referencia es decir un parámetro declarado con la palabra reservada Var. El siguiente código de ejemplo no funcionará:

   Readln(C.CompCad)

La implementación del método ObtCompCad, consistirá en llamar al método ObtCad, con el valor encontrado en la propiedad decimales, y el método PonCompCad, se implementará con el método PonCad, si este devuelve un valor diferente a cero, entonces lanzará una excepción de conversión invalida EconvertError. A continuación se muestra el código de estos dos métodos:


Descargar
Function TComplejo.ObtCompCad:string;
  Begin
    ObtCompCad:=ObtCad(decimales)
  End;
	 
Procedure TComplejo.PonCompCad(n:string);
  Begin
  if PonCad(n)<>0 then
     raise EConvertError.Create('Error datos no validos ingresados');
  End;
Código fuente 9: Métodos ObtComCad y PonComCad de la unidad Complejos.pp.
Descargar

Las propiedades también pueden hacer uso de indices, los indices de una propiedad nos permiten usar el mismo método en varias propiedades. Esto nos ayudaría a reducir código redundante o repetitivo, por ejemplo en la clase TComplejo, de la unidad Complejos.pp, se eliminaron los métodos ObtReal, ObtImag, PonReal y PonImag, y se modificaron también los métodos que hacen uso de estos; por las propiedades, Real e Imag. Estas propiedades harán uso de los métodos ObtComp y PonComp. La declaración de las propiedades Real e Imag es como sigue:

Property Real:double index 1 read ObtComp write PonComp;
Property Imag:double index 2 read ObtComp write PonComp;

Tal como se puede observar, se hace uso de la palabra reservada index, esto nos permite indicar que propiedad será modificada por uno de los métodos. Los métodos para lectura y escritura, deben tener un parámetro de tipo integer, que servirá para que él método pueda identificar, sobre que propiedad se harán los cambios. El código de estos métodos se muestra a continuación:


Descargar
Procedure TComplejo.PonComp(indice:integer;r:double);
 Begin
   if indice=1 then ParteReal:=r;
   if indice=2 then ParteImag:=r
 End;
 
Function TComplejo.ObtComp(indice:integer):double;	 
 Begin
   if indice=1 then ObtComp:=ParteReal;
   if indice=2 then ObtComp:=ParteImag
End;
Código fuente 10: Métodos PonComp y ObtComp de la unidad Complejos.pp.
Descargar

En los métodos se hace uso de la estructura if/then, para modificar los atributos ParteReal y ParteImag, no obstante se pudo usar también una estructura Case/of.

El siguiente programa hace uso de estas propiedades implementadas en la unidad complejos.


Descargar
{$codepage utf8}
{$mode objfpc}
Uses Complejos08,sysutils;
Var A:TComplejo;
Begin
  A:=TComplejo.Crear(4,2);
  Writeln(A.CompCad);
  A.CompCad:='4+3i';
  Writeln(A.CompCad);
  A.real:=5;
  A.Imag:=8;
  Writeln(A.CompCad);
End.
Código fuente 11: Ejemplo del uso de la nueva unidad Complejos.pp.
Descargar

Las propiedades también se pueden usar, para implementar clases que se comporten como arreglos, para ello se debe colocar entre corchetes el tipo de dato que se usara como indice, para acceder al atributo que será la lista a implementar. Por ejemplo la siguiente declaración, implemente una propiedad que permite leer y escribir, los elementos de una lista de enteros.

Property Elemento[i:integer]:integer read Obt write Pon;default;

Entre los corchetes se coloca el tipo de dato que se usará como indice de la lista. El indice también puede ser un tipo de dato como string, con lo cual se puede implementar una clase basada en clave y valor, que se conoce como arreglos asociativos o vectores asociativos. El código fuente de la Unidad ListaEnteros que implementa la clase TlistaEnteros, es la siguiente:


Descargar
{$codepage utf8}
{$mode objfpc}
Unit ListaEnteros;
Interface

Type
  TListaEnteros = class
    private
     Elementos:array of integer;
     
     Procedure Pon(indice:integer;r:integer);
     Function Obt(indice:integer):integer;
 
    public
     cantidad:integer;
     Constructor Crear(n:integer=100);
     Property Elemento[i:integer]:integer read Obt write Pon;default;	
  End;

Implementation

  Procedure TListaEnteros.Pon(indice:integer;r:integer);
    Begin
      Elementos[indice]:=r
    End;
 
 Function TListaEnteros.Obt(indice:integer):integer;	 
    Begin
     Obt:=Elementos[indice]
    End;

 Constructor TListaEnteros.Crear(n:integer=100);
    Begin
      SetLength(Elementos,n);
      cantidad:=n
    End;

End.
Código fuente 12: Unidad ListaEnteros.pp.
Descargar

Los métodos Pon y Obt, son los que se encargarán de colocar los números enteros a la lista. Tal como se puede observar en la propiedad Elemento, al final esta colocado la palabra reservada default, este nos permite acceder a los elementos de la clase, como si este fuera un arreglo de enteros. Asumiendo que MiLista es un objeto de la clase TlistaEnteros, a los elementos se pueden acceder del siguiente modo:

MiLista[10]:=45;

En caso no se use default, entonces para acceder a los elementos se hace del siguiente modo:

MiLista.Elementos[10]:=45;

El siguiente programa hace uso de la clase TlistaEnteros:


Descargar
{$codepage utf8}
{$mode objfpc}
Uses ListaEnteros;
Var MiLista:TListaEnteros;
    i:integer;
Begin
  MiLista:=TListaEnteros.Crear(10); //0-99 elementos;
  randomize;
  for i:=0 to MiLista.cantidad-1 do MiLista[i]:=random(1000);   
  for i:=0 to MiLista.cantidad-1 do Writeln('[',i,']=',MiLista[i])  
End.
Código fuente 13: Programa ejemplo del uso de la unidad ListaEnteros.pp.
Descargar




SIGUIENTE
SIGUIENTE
SIGUIENTE



 
‒ Comentarios y sugerencias.

Agradezco de antemano, todo comentario, sugerencia, y donativo (a través de Paypal me), que ayude a mejorar los contenidos educativos de Conoce 3000. Además, cualquier pregunta o duda que tengas lo puedes hacer por este medio. Pero, todo contenido que pueda resultar ofensivo, malicioso, racista, sexista, discriminatorio, obsceno, vulgar será eliminado.


Comments System WIDGET PACK






PORTADA |  INTERESANTE |  APUNTES |  LIBROS |  GALERIA


Creative Commons License


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