Programación en Pascal/Los objetos y las clases

IntroducciónEditar

Un objeto es un conjunto de datos de la misma entidad junto con las operaciones que permiten manejar dichos datos.

Una clase es una plantilla o estructura que contiene la definición del tipo de datos y las operaciones de manejo del mismo.

Los objetos son variables o instancias del tipo definido en la clase.

A los datos de un objeto se le denomina atributos, campos o propiedades y a las operaciones de manejo, se le llaman métodos.

Plantilla:

Type NombreClase = class
  NombreAtb1 : Tipo1;
  NombreAtb2 : Tipo2; // Atributos -> Datos
  NombreAtbN : TipoN;
  Procedure NombreMetodo1(...);
  Function NombreMetodo2(...); // Métodos -> Operaciones
  Procedure NombreMetodoN(...);
end;

Los métodos se deben implementar mediante procedimientos y/o funciones. Las clases se deben incluir en unidades, la definición de la clase se incluye en la parte de interface y en ella se indican los atributos y cabeceras de los métodos.

En la parte de implementación de la unidad se debe incluir el código de los diferentes procedimientos o funciones que representan los métodos. En una unidad se pueden incluir varias clases pero por norma general cada unidad contendrá una sola clase por modularidad.

En la definición de la clase, los atributos deben definirse antes que los métodos por cada directiva de visibilidad.

El orden entre sí de atributos y métodos no tiene influencia.

Definición y Creación de un objetoEditar

Para poder utilizar un objeto, es necesario declararlo como una variable o instancia en la sentencia siguiente:

var NombreObjeto : NombreClase;

La simple declaración no es suficiente para poder manejar el objeto, es necesario realizar, la operación de construcción o instanciación del objeto, utilizando para ello un método constructor.

Todas las clases tienen por defecto un constructor denominado Create.

Create --> TObject

Hay que tener en cuenta que toda clase que se declare en Object Pascal hereda de la clase TObject (esta herencia se verá más adelante), esta clase tiene algunos métodos como el constructor Create y el destructor Destroy.

La sintaxis es la siguiente:

NombreObjeto := NombreClase.Create;

Esta sentencia se incluye en la parte de sentencias del objeto, los objetos son dinámicos, es decir, se crean y se destruyen en tiempo de ejecución. Al ejecutarse la instanciación se crea en memoria una estructura con los datos y referencias a los métodos de la clase, se ejecutan las posibles sentencias Create que por regla general serán sentencias de inicialización y por último se carga la dirección en memoria de las estructuras del objeto en la variable objeto.

Las variables objetos, contienen direcciones de memoria de los objetos, al ser estos dinámicos.

Destrucción de un objeto, para poder destruir un objeto en memoria se usa un destructor, todas las clases tienen Destroy o Free.

NombreObjeto.Destroy;
NombreObjeto.Free;

Al ejecutarse la operación de destrucción, se ejecutan las posibles sentencias del destructor, después se libera memoria y queda la variable objeto indefinida.

La diferencia entre Destroy y Free, es que el último comprueba si el objeto no tiene valor nil (valor nulo, que no existe el objeto), si haces un Destroy con nil, el programa se cerrara con error, por ello es conveniente usar el segundo.

Para referenciar los diferentes atributos y métodos de un objeto, se utiliza la calificación:

NombreObjeto.NombreAtributo;
NombreObjeto.NombreMetodo(...);

En la definición de parámetros de entrada y/o salida de un método no se deberán incluir, aquellos que correspondan a atributos del objeto ya que al hacerse la invocación al método asociado al objeto correspondiente lleva los diferentes atributos del objeto.

EjemplosEditar

UEsfera.pas:

Unit UEsfera;

{$mode delphi}

Interface

  type TEsfera = class
    radio : real;
    centrox : real;
    centroy : real;
    centroz : real;
    Constructor Create;
    Function Superficie : real;
    Function Volumen : real;
    Procedure Visualizar;
  end;

Implementation

  Constructor TEsfera.Create;
  begin
    radio := 0;
    centrox := 0;
    centroy := 0;
    centroz := 0;
  end;

  Function TEsfera.Superficie : real;
  begin
    result := 4*3.1416*Radio*Radio;
  end;

  Function TEsfera.Volumen : real;
  begin
    result := 4*3.1416*Radio*Radio*Radio/3;
  end;

  Procedure TEsfera.Visualizar;
  begin
    writeln('Radio=', radio:0:2, ' Centro X=', centrox:0:2, ' Centro Y=', centroy:0:2, ' Centro Z=', centroz:0:2);
  end;
end.

Programa.pp:

Program Esfera;

{$mode delphi}

uses UEsfera;

var
  Esfera1 : TEsfera;
  r, cx, cy, cz : real;

begin
  repeat
    write('Introducir radio mayor o igual que 0: ');
    readln(r);
  until(r>=0);
  write('Introducir coordenadas x, y, z desde el centro: ');
  readln(cx, cy, cz);
  Esfera1 := TEsfera.Create;
  Esfera1.radio := r;
  Esfera1.centrox := cx;
  Esfera1.centroy := cy;
  Esfera1.centroz := cz;
  Esfera1.Visualizar;
  writeln('Superficie=', Esfera1.Superficie:0:2);
  writeln('Volumen=', Esfera1.Volumen:0:2);
end.