En todos los ejemplos que hemos visto a lo largo de todo este tiempo hemos estado declarando atributos y métodos "al vuelo" dentro de una clase. Lo correcto sería ordenarlos e indicar una correcta visibilidad o alcance.
La teoría de OO indica que las clases deben seguir el principio de abierto/cerrado. De forma simple lo que establece este principio es que las clases deben permanecer abiertas al público para permitir extender de ella y añadir nuevos atributos y métodos; pero que además permanezcan cerrado a las implementaciones que no sea de verdadero interés al programador final (cliente).
¿Porqué este principio? Para evitarnos dolores de cabezas con implementaciones que no vienen al caso discutir, y alterar. Nos ocultan esa información interna puesto que no hace a los objetivos de los desarrolladores finales: usar los componentes.
¿Cómo es que nos ocultan esos detalles internos?
La respuesta: indicando la visibilidad de los atributos, propiedades y métodos.
Visibilidad privada, pública y protegida
Hay tres tipos de visibilidad:
Privada: Un atributo, propiedad o método privado es invisible fuera de la unidad donde se lo declara. Se establece anteponiendo la sección "private" en la clase:
TClase = class // sección privada private FNombre: string; procedure UnMetodo; ... end;
Como desarrolladores de la clase tenemos acceso a cualquier elemento de la clase.
Pública: Un atributo, propiedad o método público es visible fuera de clase en cualquier parte. Se nos ocultan otros detalles técnicos.
Como Clientes hacemos uso indirecto de ciertos elementos privados mediante el acceso público. De forma análoga a "private", para dar visibilidad pública debemos anteponer "public":
TClase = class // privados FNombre: string; procedure UnMetodo; // publicos Edad: string; procedure OtroMetodo;
Protegida: Un elemento protegido es visible solamente en la unidad donde se declare la clase y en cualquier clase que descienda de ésta.
Es un término intermedio entre el privado y protegido. Como desarrolladores herederos necesitamos conocer algunos detalles técnicos e internos del funcionamiento de la clase base para poder implementar nuestros propios mecanismos y extenderlos en caso de ser necesario. Pero luego, como clientes no tenemos acceso.
La clase base por tanto, debe ofrecer elementos con visibilidad protegida si es que parte del funcionamiento se puede ver afectado o le resulta de interés al programador conocerlos.
Preste atención: dije algunos, no todos.
En este caso hacemos anteponemos "protected":
TClase = class // privados FNombre: string; procedure UnMetodo; ... // publicos Edad: string; procedure OtroMetodo; ... // protected Sexo: TSexo; procedure MetodoProtegido; ...
No necesariamente debe seguirse el orden privado-publico-protegido. Pueden estar en cualquier orden, incluso mezclarlos:
private Algo: TAlgo; public procedure OtraCosa; Private function SeHacer(Algo: TAlgo); protected FCampo: integer; protected procedure NoSeHacerEsto(Algo: TAlgo); virtual; end;
La única regla que debemos seguir es primero los campos o atributos y luego los métodos.
Por lo general en protegido no se encuentran campos o atributos, es habitual esperar métodos virtuales, abstractos, y/o sobrecargados para que el desarrollador que hereda la clase pueda, en base a éstos, extenderlos.
Saludos,