Programación en Pascal/Visibilidad
Introducción
[editar]Las directivas de visibilidad permiten restringir el acceso a los atributos y métodos de un objeto, la directiva más restrictiva es private, que únicamente deja acceder a los atributos y métodos desde la unidad en la que esta la clase, en contrapartida, tenemos la public y permite acceder desde cualquier método a los atributos especificados como tales. También existe la directiva protected, de la que se hablara en el tema de herencia que es como private, pero los atributos bajo esta directiva también esta disponible en las clases hijas (ATENCIÓN: las directivas explicadas aquí pueden tener una funcionalidad diferente en otros lenguajes. Por ejemplo los atributos y métodos bajo private en C++, también, lo hereda la clase hija y los atributos y métodos bajo protected en C++ pueden ser llamados bajo funciones amigas, etc.).
Estas directivas explicadas anteriormente se ponen en la definición de la clase::
Type NombreClase = class
private
...
public
...
end;
Por defecto si no se especifica la directiva se tomara toda la definición de la clase como public.
Reglas de estilo en la definición de las clases
[editar]Dentro de cada clase se definirán dos constructores Create, uno de ellos sin parametros, es el que viene por defecto heredado de TObject, que inicializara los atributos del objeto con los valores por defecto.
El 2º constructor inicializara los atributos con los datos que se pasen como parámetros, existirá por lo tanto, un parámetro por cada atributo definido en la clase.
Al denominarse de la misma forma los dos constructores, es lo que se denomina sobrecarga que permite definir en un mismo sitio objetos con un mismo nombre pero distinta lista de parámetros, en Object Pascal, la sobrecarga se especifica mediante la palabra reservada overload.
Los atributos de la clase, se declararan como privados, mediante la directiva private y los métodos serán públicos, al declarar atributos como privados, se impide que el programa pueda usarlo directamente, para poder hacer uso de atributos, se hará un método consultor que devuelva el valor de un método y un método modificador que modifique el contenido de un atributo, existirá un consultor y un modificador por cada atributo.
Consultor -> GetNombreAtributo Modificador -> SetNombreAtributo
Los métodos consultores Get, se implementaran como funciones del tipo correspondiente a cada uno de los atributos
Los métodos modificadores Set, se implementaran como procedimientos (procedures), con un parámetro por cada valor correspondiente al nuevo dato a asignar al atributo.
Debido al hecho de declarar los atributos como privados con el fin de evitar utilizaciones inapropiadas por parte del programa, a dichos atributos se podrá acceder únicamente mediante sus métodos consultor y modificador, que sean públicos. A esta propiedad de acceder a los atributos a través de los métodos, se conoce en POO (Programación Orientada a Objetos) como encapsulamiento.
Ejemplos
[editar]Siguiendo los ejemplos del capitulo anterior, vamos a modificar el archivo UEsfera.pas:
Unit UEsfera;
{$mode delphi}
inteface
type TEsfera = class
public
constructor Create;
constructor Create(r, cx, cy, cz : real); overload;
function GetRadio : real;
procedure SetRadio(x : real);
function GetCentrox : real;
procedure SetCentrox(x : real);
function GetCentroy : real;
procedure SetCentroy(x : real);
function GetCentroz : real;
procedure SetCentroz(x : real);
procedure Visualizar;
function Superficie : real;
function Volumen : real;
private
radio, centrox, centroy, centroz : real;
end;
implementation
Constructor TEsfera.Create;
begin
radio := 0;
centrox := 0;
centroy := 0;
centroz := 0;
end;
Constructor TEsfera.Create(r, cx, cy, cz : real);
begin
radio := r;
centrox := cx;
centroy := cy;
centroz := cz;
end;
function TEsfera.GetRadio : real;
begin
result := radio;
end;
procedure TEsfera.SetRadio(x : real);
begin
radio := x;
end;
function TEsfera.GetCentrox : real;
begin
result := centrox;
end;
procedure TEsfera.SetCentrox(x : real);
begin
centrox := x;
end;
function TEsfera.GetCentroy : real;
begin
result := centroy;
end;
procedure TEsfera.SetCentroy(x : real);
begin
centroy := x;
end;
function TEsfera.GetCentroz : real;
begin
result := centroz;
end;
procedure TEsfera.SetCentroz(x : real);
begin
centroz := x;
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.SetRadio(r);
Esfera1.SetCentrox(cx);
Esfera1.SetCentroy(cy);
Esfera1.SetCentroz(cz);
Esfera1.Visualizar;
writeln('Superficie=', Esfera1.Superficie:0:2);
writeln('Volumen=', Esfera1.Volumen:0:2);
end.