lunes, 4 de julio de 2016

PROGRAMACION ORIENTADA OBJETOS EN PASCAL

La estructura registro de Pascal es ampliada para definir otras estructuras, cómo object (objeto) y class (clase): Objeto (object) Un objeto es un tipo especial de registro. El registro contiene todos los campos que se declaran en la definición del objeto, al igual que un registro convencional, pero ahora los procedimientos y funciones pueden ser declarados como parte del registro y se mantienen como punteros a los métodos asociados con el tipo del objeto. Por ejemplo, un objeto podría contener un conjunto de valores reales, junto con un método de cálculo de la media de estos. Type TMedia = Object CuantosValores: Integer; Valores: Array [1..200] of Real; Function Media : Real; {calculo de la media de los valores de la matriz} End; Los objetos pueden heredar los campos y los métodos del objeto padre. Esto significa que estos campos y métodos pueden ser utilizados como si se incluyesen entre los objetos declarados en la definición del objeto hijo. Por otra parte, se introduce el concepto de visibilidad: campos, procedimientos y funciones pueden ser declaradas como públicos, protegidos o privados. De forma predeterminada, los campos y métodos son públicos y pueden ser exportados fuera de la unidad actual. Los campos y métodos protegidos sólo están disponibles para los objetos que sean descendientes del objeto en que se declaran. Los campos o métodos que se declaran privados sólo son accesibles dentro de la unidad en que son declarados: su alcance se limita a la sección implementation de la unidad. Clase (class) Los objetos no son usados con frecuencia por sí mismos en FreePascal y Lazarus; en lugar de ello, se utilizan las Clases. Una clase se define casi de la misma manera que un objeto, sólo que es un puntero a un objeto en lugar del objeto en sí.



Técnicamente, esto significa que la clase se asigna al montículo de un programa, mientras que los objetos se asignan a la pila del mismo. Este es un ejemplo sencillo de declaración de una clase típica (clase TPen): {-----------------------------------------} {ejemplo de definición de la clase TPen en la LCL} {-----------------------------------------} type TPen = class(TFPCustomPen) private FHandle: HPen; FColor: TColor; FPenHandleCached: boolean; procedure FreeHandle; protected procedure DoAllocateResources; override; procedure DoDeAllocateResources; override; procedure DoCopyProps(From: TFPCanvasHelper); override; procedure SetColor(const NewColor: TColor; const NewFPColor: TFPColor); virtual; procedure SetFPColor(const AValue: TFPColor); override; function GetHandle: HPEN; procedure SetHandle(const Value: HPEN); procedure SetColor(Value: TColor); procedure SetMode(Value: TPenMode); override; procedure SetStyle(Value: TPenStyle); override; procedure SetWidth(value: Integer); override; public constructor Create; override; destructor Destroy; override; procedure Assign(Source: TPersistent); override; property Handle: HPEN read GetHandle write SetHandle; published property Color: TColor read FColor write SetColor default clBlack; property Mode default pmCopy; property Style default psSolid; property Width default 1; end; Resaltar que esta clase es definida como descendiente de otra clase, TFPCustomPen, que es el padre o ancestro de la que hereda todas sus propiedades y métodos.



La clase tiene sus campos agrupados bajo las secciones private (privado) - esto significa que los elementos definidos aquí sólo están disponibles o visibles a otras clases o procedimientos o función que se definan dentro de esta misma unidad de programa (este caso la unidad es Graphics, por lo que cualquiera de las otras clases en ella definidas, tales como TBitMap, TPicture, etc. pueden utilizarlos). Son esencialmente variables locales (por ejemplo,FColor,FPenHandleCached) o los métodos utilizados a nivel local (FreeHandle), pera que puedan utilizarse o referirse desde los elementos declarados en las secciones protected o public. protected (protegido) - los elementos aquí definidos sólo están disponibles o visibles a las clases que son descendientes de esta clase, y por tanto heredan sus propiedades y métodos public (público) - los elementos aquí definidos están disponibles desde cualquier otra unidad de programa que incluya esta unidad en su cláusula Uses published (publicado) - El ámbito es el mismo que en el caso de la sección public, pero el compilador generará información de tipo necesaria para el almacenamiento automático de la clase. Habitualmente los elementos aquí listados son los que aparecen en el Inspector de Objetos de Lazarus; si no existe sección published todos los elementos de la sección public aparecerán en el Inspector de Objetos. Métodos Un método es exactamente los mismo que un procedimiento o una función mormales, la diferencia es que puede tener directivas adicionales. Algunos de los métodos definidos anteriormente se etiquetan con la directiva virtual, otros han sido etiquetados con la directiva override. virtual significa que el tipo real de la instancia actual de un método no se conoce en tiempo de compilación, pero se selecciona en tiempo de ejecución dependiendo de quién y cómo en realidad ejecute el método. Podría ser considerado como un comodín en la definición de la clase override significa que en tiempo de ejecución a nivel local, la definición dada aquí tomará el lugar de la definición heredada del ancestro de la clase, sobre todo si esta es virtual. Si desea utilizar el método definido en la clase ancestro, es necesario recurrir a él explícitamente con la cláusula inherited. Los métodos sin la directiva virtual u override son estáticos (lo habitual en Pascal). Aquellos con la directiva virtual u override son métodos dinámicos. Tipos especiales de métodos son: Create - el constructor de la clase, que se encarga de la asignación de memoria, así como la recogida de toda la información necesaria y de configurar e iniciar las diversas propiedades. Destroy - el destructor de la clase, que elimina todas los elementos de la clase del sistema en forma ordenada y lógica, y devuelve todos los recursos utilizados por la misma, para que el sistema pueda reutilizarlos. Propiedades Las propiedades son semejantes a los campos de los registros convencionales de Pascal, pero pueden tener las especificaciones read y/o write read especifica el campo o la función que devuelve el resultado del tipo correcto para la propiedad. En el ejemplo anterior, la propiedad Color tiene especificado que la variable local FColor devolverá el valor de la propiedad. Si una propiedad especifica un read pero no un write, será de sólo lectura. write especifica el campo, la función o procedimiento que almacenará el valor de la propiedad en una ubicación determinada. En el ejemplo, Color tiene especificado SetColor como write, por lo que será este procedimiento (definido en la sección protected) el que escribirá el valor del color en la ubicación destinada para ello, FColor en este caso. Si una propiedad especifica un write pero no un read, será de sólo escritura. default - Resaltar que es posible establecer un valor por defecto para una propiedad. Por ejemplo, Color a la que aquí se da el valor por defecto clBlack (negro) en el momento de su creación. Posteriormente se puede dar un valor diferente, por una asignación en el programa, o mediante el Inspector de Objetos. Extensiones al lenguaje de Free Pascal FPC incluye varias extensiones al lenguaje de la sintaxis "estándar" de Pascal para dar soporte a la programación orientada a objetos, Objetos (chapter 5) Programming Using Objects Clases (chapter 6) Programming Using Classes Interfaces (chapter 7) Programming Using Interfaces Genéricos (chapter 8) Programming Using Generics Estas extensiones se describen en los capítulos indicados de la Guía Referencia del lenguaje de FPC: http://www.freepascal.org/docs.var. Enlaces a páginas de tutoría para cada concepto se incluyen arriba. La Guía de Referencia del lenguaje incluye diagramas de sintaxis y otros detalles que no figuran en esta tutoría introductoria. De las cuatro características enumeradas anteriormente, Objetos y Clases forman la base de la programación orientada a objetos (POO) en FPC y Lazarus. Para los novatos en POO, la sección Objetos incluye muchos conceptos introductorios y la sección Clases elude la repetición enfatizando las similitudes y diferencias con la sintaxis de Objetos. En general la implementación de Classes parece ser usada más ampliamente por los desarrolladores Lazarus que Delphi. A menudo la palabra "objetos" se utiliza para referirse a lo que es en realidad una "clase" en el dialecto Clases de la POO en FPC. Estos documentos están redactados para minimizar cualquier confusión de terminología, pero fuera de este documento, el término "objeto" a menudo se refiere a los objetos creados a partir de una clase. De hecho, la librería de tiempo de ejecución (RTL) de FPC incluye una biblioteca con base de clases llamada TObject. Los usuarios familiarizados con la implementación POO del viejo Turbo Pascal, pueden omitir, si quieren, la sección sobre Clases ya que la implementación de objetos se basa en el dialecto de Turbo Pascal. La sección Clases resultará familiar a los usurios de Delphi ya que está basada en la sistaxis de este. Ten en cuenta que bastante de lo escrito en la sección Clases hace refencia a conceptos de la sección Objetos. Para los desarrolladores familiarizados con diversos dialectos Object Pascal en Apple, cómo THINK y MPW, ni los dialectos de objetos ni los de clases de FPC proporcionan una vía de migración directa. En marzo de 2009, hay discusiones en la lista de correo sobre Mac Pascal que pueden proporcionar algún apoyo al compilador (nueva sintaxis) para acceder al marco de Objective C/Cocoa de Apple. Conceptos Generales de Pascal Orientado a Objetos La POO provee formas distintas para manejar y encapsular datos y dirigir el flujo del programa en comparación con otras caracteristicas y estructuras disponibles el el lenguaje de programación. La POO a menudo se presta al modelado de ciertas aplicaciones, tales como interfaces de usuario gráficas (GUI) y sistemas físicos de una manera que parece más natural. Sin embargo la POO no es apropiada para todas las aplicaciones. El control del programa no es tan explícito como en la más básica construcción procedimental Pascal. Para obtener el máximo beneficio de la POO, se requiere, a menudo, la comprensión de grandes bibliotecas de clases lo que puede traducirse en una empinada curva de aprendizaje. El mantenimiento de grandes aplicaciones de código POO tiene sus ventajas e inconvenientes respecto a mantener código estrictamente procedural. Hay muchas fuentes para el aprendizaje de análisis orientado a objetos, diseño y técnicas de programación que están fuera del alcance de esta guía. Hay numerosos lenguajes de programación que incorporan características de POO como extensiones o en la base del mismo. Por tanto, hay muchos términos diferentes para describir conceptos OO. Incluso dentro de FPC, algunos términos se solapan. En general, la POO por lo común consiste en el concepto de un objeto de programación (o unidad de información), que de forma explícita combina y encapsula un conjunto relacionado de datos y procedimientos que actúan sobre los datos. Estos datos son generalmente persistentes durante la ejecución del programa, pero con mecanismos para reducir algunos de los problemas inherentes a la declaración de variables globales. Además, los lenguajes OOP permiten a los objetos, de modo incremental, ser modificados y/o ampliados sobre la base del objeto previamente definido. Esta característica está relacionada generalmente con los términos herencia y polimorfismo. Muchos lenguajes POO utilizan los términos método o mensaje, refiriéndose a los procedimientos que pertenecen a un objeto. Gran parte del poder de la POO se debe al enlace dimámico en tiempo de ejecución en lugar de enlazar en la compilación. Este enlace dinámico de los métodos es similar al uso de variables de procedimiento y parámetros de procedimiento, pero con una cohesión sintáctica mayor, la encapsulación con los datos está relacionada con heredar también el comportamiento de los métodos previamente definidos. Las páginas que siguen presentan un wiki como punto de partida para descubrir más sobre el análisis, diseño y programación a la manera de la Orientación a Objetos.

No hay comentarios:

Publicar un comentario