Sunteți pe pagina 1din 8

Introduccin: La programacin orientada a objetos (POO) nos permite escribir cdigo menos propenso a fallos adems de permitirnos la reutilizacin

de cdigo de forma ms conveniente. En este artculo veremos las caractersticas de la POO desde el punto de vista de lo s lenguajes de .NET Framework y cmo utilizar los distintos elementos que nos perm itirn crear cdigo que sea ms fcil de escribir y mantener.

LA PROGRAMACIN ORIENTADA A OBJETOS En Todo Programacin existe una seccin denominada Cuadernos de Principiantes donde se estudia algoritmia y estructuras de datos a nivel iniciacin. Est planificado qu e se estudie a nivel terico la programacin orientada a objetos, por tanto para aqu ellos que no tengis nocin alguna sobre POO mejor guarda a buen recaudo este nmero d e TP y espera a aprender los conceptos tericos necesarios para luego aplicarlos e n el marco, nunca mejor dicho, de .NET.

LOS PILARES DE LA POO Recordemos que tres son las principales caractersticas de un lenguaje orientado a objetos, es decir, se considera que un lenguaje est totalmente orientado a objet os si es capaz de proveer estas tres caractersticas: Encapsulacin Herencia Polimorfismo Veamos una pequea descripcin de cada una de ellas y despus las ampliaremos para com prender mejor su significado y cmo puede ayudarnos a crear aplicaciones que aprov echen todas las posibilidades que nos da la POO. La ENCAPSULACIN es la cualidad de unificar los datos y la forma de manipularlos, de esta forma podemos ocultar el funcionamiento de una clase y exponer solo los datos que manipula (mediante propiedades), as como proveer de medios para poder m anipular dichos datos (mediante mtodos). De esta forma solo exponemos al mundo ex terior la informacin y la forma de manipularla, ocultando los detalles usados par a manejar esos datos y, lo que es ms importante, evitando que nadie manipule de u na forma no controlada dicha informacin. La HERENCIA es la cualidad de poder crear nuevas clases (o tipos) basadas en otr as clases, de forma que la nueva clase obtenga todas las caractersticas de la cla se que ha heredado, tanto los datos que contiene como la forma de manipularlos, pudiendo aadir nuevas caractersticas e incluso cambiar el comportamiento de alguna s de las incluidas en la clase base, (siempre que as se haya previsto). Mediante la herencia podemos crear de forma fcil una jerarqua de clases que comparten un mi smo comportamiento bsico pero que cada nueva generacin puede tener (y de hecho tie ne) un nuevo comportamiento. El POLIMORFISMO es la cualidad de implementar de forma particular algunas de las caractersticas que tienen las clases, de forma que cuando necesitemos usarlas no nos preocupe la implementacin interna que cada una tenga, lo que realmente nos i nteresa o nos debe importar es que podemos usar esas caractersticas e incluso pod amos acceder a ellas de forma annima... o casi.

OTROS CONCEPTOS DE LA POO Tal como tendrs oportunidad de ver en los Cuadernos de Principiantes y lo indicad o en el cuadro Los pilares de la POO, la POO se basa en tres caractersticas que s on comunes a todos los lenguajes orientados a objetos, pero si tenemos esas cara ctersticas y no sabemos cmo aplicarlas, la verdad es que no nos ser de mucha utilid ad. Pero antes de ver algo de cdigo concreto, creo que es importante que aprendamos o tros conceptos relacionados tambin con la POO, pero esta vez desde un punto de vi sta del programador, es decir, vamos a dejar en parte la teora y vamos a ser algo ms prcticos, ya que los siguientes conceptos sern con los que tendremos que "brega r" a diario. Adems nos interesa conocerlos para aprovechar lo que un lenguaje de programacin orientado a objetos nos ofrece, si bien, es posible que, al menos de forma genrica, no todos los lenguajes dispongan de ellos. Por eso, aunque lo que se ha dicho y se diga a continuacin ser vlido para cualquier lenguaje orientado a objetos, lo vamos a enfocar desde el punto de vista de .NE T Framework, ms concretamente desde el punto de vista del programador de Visual B asic .NET y C#.

LAS CLASES Y ESTRUCTURAS Como hemos estado mencionando, en los lenguajes orientados a objetos, existe el concepto clase. Cuando hablamos de clases, tambin podemos extenderlo a estructura s, de hecho, para los programadores de C++ una clase no es ms que una estructura que se comporta de forma diferente. Una clase es una pieza de cdigo en la que podemos definir una serie de datos y al mismo tiempo unos mtodos (funciones o procedimientos) que nos permitirn acceder a esos datos. Cuando definimos una clase, lo que estamos haciendo es definir una plantilla, a partir de la cual podemos crear objetos en la memoria. Por tanto, la clase es el molde con el cual podemos crear nuevos objetos. Para poder crear algo "tangible " a partir de una clase, tenemos que crear en la memoria un nuevo objeto del tip o de la clase, en estos casos lo que decimos es que instanciamos un nuevo objeto de la clase. A partir de ese momento tendremos algo real con lo que podemos tra bajar: una instancia de la clase, es decir, la definicin realizada en la clase se ha convertido en un objeto al que podemos acceder y que podemos empezar a utili zar, dndole nuevos valores a los datos que manipula y usando las funciones que no s permiten manipular dichos datos. La diferencia principal entre una clase y una estructura es la forma en que se c rean los objetos que representan a esas "ideas". Los objetos creados a partir de las clases son objetos por referencia, es decir, si declaramos una variable par a manipular ese objeto, lo que tendremos ser una referencia (o puntero) a una dir eccin de memoria en la que realmente est el objeto. Mientras que los objetos cread os a partir de una estructura se almacenan de forma diferente, en lugar de "apun tar" a una direccin de memoria en la que se encuentra el objeto, es como si las v ariables declaradas como estructuras fuesen realmente el objeto permitindonos hac er ciertas operaciones y manipulaciones que los objetos obtenidos a partir de un a clase no pueden realizar de la misma forma. Esto lo veremos despus con ms detall e.

NOTA: Clases En .NET siempre usamos una clase para escribir cualquier tipo de cdigo. Por tanto , hagamos lo que hagamos en .NET Framework, debemos hacerlo dentro de una clase. Esto no quiere decir que siempre tengamos que usar las caractersticas de la POO, ya que si simplemente queremos hacer una aplicacin que muestre un mensaje en la consola, el cdigo no tiene porqu usar la herencia, el polimorfismo o la encapsulac in, simplemente escribimos el cdigo que muestre el mensaje y asunto arreglado, per o lo que si podremos hacer es usar algunas de las "otras" ventajas que nos aport a la programacin orienta a objetos.

INTERFACES Cuando hablamos de polimorfismo, ineludiblemente tenemos que hablar de las inter faces, ya que, principalmente, nos posibilita utilizar esta caracterstica de la P OO. La pregunta es: qu es una interfaz? Aqu no hablamos de "interfaces de usuario", es decir, lo que se mostrar al usuario de nuestra aplicacin, sino a una clase esp ecial en la que solamente se definen los mtodos y propiedades que una clase que l a implemente debe codificar. Las interfaces representan un contrato, de forma qu e cualquier clase que la implemente debe utilizar los miembros de la interfaz us ando la misma forma en que sta la ha descrito: mismo nmero de argumentos, mismo ti po de datos devuelto, etc. Gracias a la implementacin de interfaces podemos crear relaciones entre clases qu e no estn derivadas de la misma clase base, pero que tengan mtodos comunes, al men os en la forma, aunque no necesariamente en el fondo. Anteriormente usamos el ej emplo del mtodo Guardar, este mtodo se puede definir en una interfaz, las clases q ue quieran implementar un mtodo Guardar "estandarizado" firmarn un contrato con la interfaz que lo especifica, aunque la forma interna de funcionamiento solo atae al programador de la clase, lo importante es saber que cualquier clase que haya firmado ese contrato tendr que seguir las condiciones impuestas por la interfaz, de esta forma todas las clases tendrn un mtodo Guardar "compatible", aunque, tal c omo mostramos antes, cmo se realice esa accin de guardar no debe preocuparnos, sim plemente nos fiaremos de que se ha implementado adecuadamente para almacenar los datos que la clase manipula.

NOTA: HERENCIA MLTIPLE Y HERENCIA SIMPLE En C++ y algunos otros lenguajes orientados a objetos se permiten la herencia mlt iple, es decir, una clase se puede derivar de varias clases a la vez. Los lengua jes de .NET Framework, usan lo que se denomina herencia simple, es decir, una cl ase solo se puede derivarse directamente de otra clase, si bien se permite imple mentar mltiples interfaces. Pero debido a cmo funciona la herencia, cualquier clase derivada a partir de otra , heredar indirectamente todas las clases e interfaces que la clase base haya her edado o declarado. Adems, en .NET, todas las clases siempre se derivan de la clas e base Object que es la clase que est en la parte superior de la jerarqua de clase s.

CONSTRUCTORES Y DESTRUCTORES, EL PUNTO DE INICIO Y FINAL DE LAS CLASES

Cuando creamos un objeto a partir de una clase, se sigue un proceso, el cual emp ieza en el momento en que decidimos crear una nueva instancia de dicha clase. En estos casos, el compilador utiliza lo que se llama el constructor de la clase . Siempre que se crea un nuevo objeto en la memoria est involucrado el constructo r de la clase. Los constructores son procedimientos especiales (funciones que no devuelven un v alor) en los que podemos escribir toda la lgica que debe usarse para la correcta creacin del objeto. Por ejemplo, podemos inicializar las variables usadas, podemo s asignarle algunos valores predeterminados, etc. De igual forma, cuando un objeto ya no se necesita ms, se destruye mediante una l lamada al destructor de la clase. En .NET la destruccin de los objetos suele hace rse de forma automatizada, es decir, a diferencia de lo que ocurre en otros ento rnos de programacin, no es necesario destruir explcitamente un objeto para elimina rlo de la memoria, esa gestin de limpieza de objetos la realiza el recolector de basura (Garbage Collector, GC) de .NET, el cual decide cuando un objeto no se ne cesita ms y en ese caso lo elimina dejando libre la memoria utilizada para otros menesteres.

SOBRECARGA (OVERLOAD) Una de las caractersticas que tambin nos ofrece los lenguajes orientados a objetos es la posibilidad de definir varias funciones de las clases con un mismo nombre , de esta forma, podremos crear versiones diferentes, por ejemplo para que recib an argumentos de distintos tipos sin necesidad de cambiarle el nombre. Supongamos que queremos hacer una funcin que realice cualquier tipo de operacin so bre dos valores numricos, sera lgico pensar que si esos valores son de tipo entero, el resultado que devuelva la funcin tambin debera ser de tipo entero, en caso de q ue los valores a usar en la operacin son de tipo flotante, el resultado podra devo lverlo de ese mismo tipo. En los lenguajes no orientado a objetos, tendramos que crear dos funciones con no mbres diferentes, por ejemplo: sumaInt y sumaFloat. Pero la sobrecarga nos permi te crear dos funciones que se llamen suma y el compilador utilizar la adecuada se gn el tipo de datos que pasemos como argumentos. El nico requisito para poder crear sobrecargas de mtodos es que las diferentes ver siones se diferencien en los argumentos, ya sea porque sean de diferentes tipos de datos o porque el nmero de argumentos usados sea diferente, de esa forma el co mpilador no tendr ningn problema en saber cual debe usar en cada ocasin. La sobreca rga la podemos aplicar tanto a los constructores como a cualquier otro mtodo de l a clase.

NOTA: Sobrecarga No existir la posibilidad de crear mtodos sobrecargados si solamente se diferencia n en el tipo de datos devuelto, ya que en esos casos el compilador no podr decidi r correctamente qu mtodo debe utilizar.

LOS MIEMBROS DE LAS CLASES: CAMPOS, PROPIEDADES Y MTODOS Como hemos comentado, las clases manejan datos y proveen de funciones para acced

er a esos datos. Para ser precisos, los datos se mantienen o almacenan intername nte en los campos declarados en las clases. Los campos no son otra cosa que vari ables declaradas en la clase, habitualmente declaradas de forma privada. Por qu de claradas de forma privada? Precisamente para seguir o cumplir la caracterstica de encapsulacin de la POO, es decir, los datos no deben exponerse de forma directa. Si queremos exponer los datos, podemos usar las propiedades. Las propiedades son funciones especiales que nos permiten acceder a esos datos, aunque para ser ms p recisos, las propiedades realmente representan a los datos que una clase contien e, al menos de forma pblica. De esa forma podemos "controlar" la forma en que se leen o asignan esos datos, ya que las propiedades realmente son funciones en las que podemos escribir cdigo para controlar los valores asignados o ledos. Los mtodos nos permitirn realizar acciones sobre los datos, por ejemplo devolver u n rango de valores o simplemente una representacin amigable de la informacin conte nida. Debido a que algunas veces los mtodos devolvern algo y otras no, podemos usa r tanto funciones que devuelvan o no un valor.

NOTA: Mtodos En C# los mtodos siempre son funciones, que devolvern un tipo concreto o el valor especial void, que se usa para indicar que una funcin no devolver ningn valor. En Visual Basic .NET existen dos tipos de mtodos distintos, las funciones (Functi on) que siempre devuelven un valor y los procedimientos (Sub) que no devuelven n ingn valor.

Adems de los campos, mtodos y propiedades, las clases tienen otros miembros como l os eventos y las enumeraciones. stos nos permitirn recibir notificaciones de cuand o algo ocurra (eventos) o declarar ciertos valores constantes que podemos usar p ara restringir algunos valores asignados a las propiedades o que nos permitan se leccionar de forma coherente la informacin que queremos obtener (enumeraciones).

EL MBITO DE LOS MIEMBROS DE LAS CLASES Las buenas formas de trabajar con las clases nos indican que los campos deberan s er privados, con idea de que no estn accesibles de forma externa. Por supuesto ta mbin podemos definir otros miembros de las clases de forma privada, esto es til cu ando la funcionalidad es para uso exclusivo de otros miembros de la clase. Pero cuando queremos exponer la funcionalidad fuera de la clase podemos hacerla de va rias formas, aqu es donde entran en juego el mbito de los miembros de las clases. El mbito lo aplicamos para permitir el acceso desde cualquier cdigo fuera de la cl ase o para restringir ese acceso. Dependiendo de cmo queramos que se acceda a los miembros de la clase podemos usar distintos modificadores de mbito. Veamos los que podemos usar y cuando y porqu usarlos. La instruccin entre parntesis ser la que tendremos que usar en C#. Private (private). Para uso privado. Cuando declaramos un miembro como privado sl o lo podremos acceder desde la propia clase. Este es el ms restrictivo y el que s e recomienda para los campos y las funciones de uso interno. Protected (protected). Uso protegido. Los elementos declarados como protegidos sl o estarn accesibles, adems de en la propia clase, por cualquier clase derivada.

Friend (internal). Para uso dentro de la propia aplicacin. Cuando declaramos un m iembro con este modificador, solo podremos acceder a l desde la propia clase o de sde cualquier cdigo que se encuentre en el mismo ensamblado (proyecto). Protected Friend (protected internal). Una mezcla de Protected y Friend, es deci r solo accesible desde las clases derivadas o desde el mismo proyecto. Public (public). Este modificador de mbito nos permite exponer pblicamente cualqui er miembro de la clase, de forma que no haya restricciones para acceder a l.

NOTA: mbito Los miembros de una clase los podemos declarar sin especificar el mbito, dependie ndo del lenguaje de programacin que usemos se aplicar un modificador de mbito u otr o. En C#, si no indicamos el mbito, las declaraciones se consideran privadas, mie ntras que en Visual Basic .NET el mbito predeterminado es Friend.

MIEMBROS VIRTUALES, NO REEMPLAZABLES Y ABSTRACTOS Para ir terminando la parte "terica" sobre la programacin orientada a objetos, vea mos cmo podemos darle un significado distinto a los miembros de una clase, depend iendo de cmo queramos que se comporten y por extensin cmo podemos utilizarlos tanto en la propia clase como en las clases derivadas. Como hemos comentado, cuando una clase hereda a otra podemos modificar el compor tamiento de los miembros heredados, pero estos solamente se podrn modificar si la clase base as lo contempla o lo permite. De forma predeterminada, al menos en .N ET, cuando declaramos un mtodo o una propiedad en una clase, solo podremos accede r a l desde una instancia creada (un objeto) en memoria, desde donde podemos usar los depender del mbito que le hayamos aplicado. De igual forma, el que una clase q ue se base en otra, pueda crear su propia versin de ese mtodo o propiedad depender de que la clase base lo haya declarado como virtual (Overridable en VB .NET). Lo s mtodos virtuales sern los que podamos sobrescribir en las clases derivadas, de f orma que podamos crear nuestras propias versiones. En .NET los miembros de una c lase no son virtuales de forma predeterminada. Por tanto, si queremos que la cla se derivada pueda crear su propia versin de un mtodo, debemos declararlo como virt ual o "redefinible". Si en una clase base hemos definido un mtodo virtual, pero posteriormente queremo s que no se pueda seguir redefiniendo en otras clases derivadas, debemos indicar lo usando el modificador NotOverridable, el cual se usar junto con Overrides, ya que sobrescribe un miembro de la clase base y como adems lo queremos marcar como no virtual, debemos usar las dos instrucciones: Overrides NotOverridable, (en C# se indicar con override sealed). Pero tambin se nos puede presentar el caso contrario, en el que queremos que un mt odo forzosamente haya que redefinirlo en las clases derivadas, en esos casos la clase base que lo define no incluye ninguna implementacin, es decir, el mtodo no c ontiene cdigo ejecutable, solo la definicin, (como ocurre con las interfaces). Se dice que estos mtodos son abstractos porque solo se ha definido en la forma y no se ha implementado ningn cdigo ejecutable. En Visual Basic se definen usando el mo dificador MustOverride (asbtract en C#). Estos mtodos abstractos solo se pueden d eclarar en clases abstractas (MustInherit en Visual Basic, abstract en C#) y por la necesidad de tener que redefinirlos, son implcitamente virtuales.

Las instrucciones o modificadores que nos permiten crear estos tipos de miembros son: Overridable (virtual). Los miembros virtuales son los que las clases derivadas p uedes sobrescribir para crear su propia versin. Para indicar en una clase derivad a que estamos sobrescribiendo dicho elemento, usaremos Overrides (override en C# ). NotOverridable (sealed). Los miembros virtuales heredados se pueden marcar como no virtuales, (las siguientes clases derivadas no podrn sobrescribirlos), usando esta instruccin a continuacin de Overrides (override). MustOverride (abstract). Un mtodo que se debe reemplazar en la clase derivada y q ue solo se define en la clase base sin ningn cdigo ejecutable. Los mtodos abstracto s son virtuales por defecto y solo se pueden declarar en clases abstractas.

Enmoria cuando se crea un nuevo objeto (se crea una nueva instancia). Pero es po sible que nos interese crear miembros compartidos, es decir, miembros que perten ecen a la propia clase, no a ninguna instancia en particular. Dndonos la oportuni dad de poder acceder siempre a ellos, independientemente de que hayamos creado o no un nuevo objeto en la memoria. En estos casos decimos que creamos miembros c ompartidos (estticos en el argot de C#/C++), esta diferencia de "nomenclatura" de pendiendo del lenguaje de programacin, es porque para definir un miembro pertenec iente a la clase y no a una instancia en particular, usaremos en Visual Basic la instruccin Shared (compartido), mientras que en C# se usar la instruccin static (e sttico). Resumiendo, Shared (static), declara un miembro compartido, los miembros compart idos no pertenecen a ninguna instancia en particular y solamente pueden acceder a campos u otros miembros tambin compartidos. Desde los miembros de instancia pod emos acceder tanto a miembros compartidos como de instancia.

NOTA: STATIC En Visual Basic existe tambin la instruccin Static, (que no tiene equivalencia en C#), en este caso se utiliza con variables declaradas en un procedimiento y sirv en para indicar que esa variable debe mantener el valor entre distintas llamadas a dicho procedimiento, a diferencia del resto de variables que solo existen mie ntras se ejecuta el cdigo del procedimiento y cuyos valores se pierden al finaliz a la ejecucin del mismo.

CLASES ABSTRACTAS Y SELLADAS De igual formodificar el comportamiento de los miembros de una clase, tambin pode mos cambiar el comportamiento predeterminado de las clases. Como hemos comentado, las clases de .NET pueden usarse para crear nuevas clases derivadas de ellas, esta es la funcionalidad predeterminada, pero no obligatoria , es decir, si queremos podemos usar una clase por si misma o como base de otras . Pero tambin podemos hacer que una clase solamente se use como clase base de otras , pero no se puedan usar para crear nuevas instancias en memoria, este es el cas o de las clases abstractas. Una clase abstracta puede contener miembros abstract

os, miembros normales o virtuales. Para indicar que una clase es abstracta, se u sa el modificador MustInherit en Visual Basic o abstract en C#. La contrapartida de las clases abstractas son las clases selladas o clases que n o se pueden usar como clases base, en estos casos las clases las definiremos com o NotInheritable en Visual Basic o sealed en C#. Como es lgico, las clases no her edables se pueden usar en ocasiones en las que no nos interese que nadie cambie el comportamiento que tiene, por tanto no se podrn declarar miembros virtuales ni abstractos, ya que no tendra ningn sentido. Las estructuras siempre son "clases selladas", (aunque no se use un modificador para indicarlo), por tanto, no podemos usarlas como base de otras.

Conclusiones En la segunda parte de esta serie dedicada a la programacin orientada a objetos v eremos cmo la definicin de interfaces y cmo implementarlas, ocasin que tambin aprove charemos para ver de forma prctica cmo usar el polimorfismo y la herencia en los l engu

S-ar putea să vă placă și