Está en la página 1de 45

Fundamentos de la programacin orientada a objetos

Contenido Descripcin general Clases y objetos Uso de la encapsulacin El lenguaje C# y la orientacin a objetos Definicin de sistemas orientados a objetos 36 1 2 10 23

Fundamentos de la programacin orientada a objetos

Notas para el instructor


Este mdulo proporciona a los estudiantes la teora, los conceptos y la terminologa bsica de la programacin orientada a objetos. Tambin incluye una porcin mnima de sintaxis de C#, concretamente la necesaria para la encapsulacin. Al final de este mdulo, los estudiantes sern capaces de: Definir los trminos objeto y clase en el contexto de la programacin orientada a objetos. Definir los tres aspectos bsicos de un objeto: identidad, estado y comportamiento. Describir la abstraccin y cmo ayuda a crear clases reutilizables que son fciles de mantener. Usar la encapsulacin para combinar mtodos y datos en una sola clase y forzar la abstraccin. Explicar los conceptos de herencia y polimorfismo. Crear y utilizar clases en C#.

Fundamentos de la programacin orientada a objetos

Descripcin general
Objetivo del tema
Ofrecer una introduccin a los contenidos y objetivos del mdulo.

Clases y objetos Uso de la encapsulacin El lenguaje C# y la orientacin a objetos Definicin de sistemas orientados a objetos

Explicacin previa

En este mdulo estudiar clases y objetos con ms detalle.

C# es un lenguaje de programacin orientado a objetos. En esta seccin veremos la terminologa y los conceptos necesarios para crear y utilizar clases en C#. Al final de este mdulo, usted ser capaz de: Definir los trminos objeto y clase en el contexto de la programacin orientada a objetos. Definir los tres aspectos bsicos de un objeto: identidad, estado y comportamiento. Describir la abstraccin y cmo ayuda a crear clases reutilizables que son fciles de mantener. Usar la encapsulacin para combinar mtodos y datos en una sola clase y forzar la abstraccin. Explicar los conceptos de herencia y polimorfismo. Crear y utilizar clases en C#.

Fundamentos de la programacin orientada a objetos

Clases y objetos
Objetivo del tema
Ofrecer una introduccin a los temas tratados en esta seccin.

Qu es una clase? Qu es un objeto? Comparacin de clases y estructuras Abstraccin

Explicacin previa

Los trminos clase y objeto aparecen muy a menudo. En esta seccin aprenderemos qu es lo que significan exactamente.

Toda la estructura de C# est basada en el modelo de programacin orientada a objetos. Para sacar el mximo partido a C# como lenguaje es necesario comprender la naturaleza de la programacin orientada a objetos. Al final de esta leccin, usted ser capaz de: Definir los trminos objeto y clase en el contexto de la programacin orientada a objetos. Aplicar el concepto de abstraccin.

Fundamentos de la programacin orientada a objetos

Qu es una clase?
Objetivo del tema
Explicar el concepto de clase.

COCHE? COCHE? Para el filsofo Un artefacto de clasificacin humana Clasificamos segn un comportamiento o atributos comunes Acordamos descripciones y nombres de clases tiles Creamos vocabulario; nos comunicamos; pensamos! Para el programador orientado a objetos Una construccin sintctica con nombre que describe un comportamiento y atributos comunes Una estructura de datos que incluye datos y funciones

Explicacin previa

El objetivo principal del lenguaje C# es definir clases y especificar su comportamiento.

La palabra clase proviene de clasificacin. Formar clases es el acto de clasificar, algo que hacen todos los seres humanos (y no slo los programadores). Por ejemplo, todos los coches comparten un mismo comportamiento (se pueden dirigir, detener,) y atributos comunes (tienen cuatro ruedas, un motor,). Usamos la palabra coche para referirnos a todos estos comportamientos y propiedades comunes. Imaginemos qu ocurrira si no fusemos capaces de clasificarlos en un concepto al que damos un nombre. En lugar de coche, tendramos que decir todas las cosas que coche significa. Las frases se haran largas y complicadas, y de hecho es muy probable que la comunicacin fuera imposible. En la medida en que todos estemos de acuerdo en lo que significa una palabra (es decir, en la medida en que todos hablemos el mismo idioma), podremos comunicarnos y expresar ideas complejas, pero precisas, de una forma compacta. Estos conceptos con nombre nos sirven a su vez para crear conceptos de un nivel ms alto y para aumentar la capacidad expresiva de la comunicacin. Todos los lenguajes de programacin describen datos y funciones comunes. Esta capacidad de describir caractersticas comunes ayuda a evitar la duplicacin. Uno de los lemas bsicos de la programacin es No te repitas. Un cdigo duplicado crea problemas porque es ms difcil de mantener. Por el contrario, un cdigo que no se repite es ms fcil de mantener, es parte porque es ms corto. Los lenguajes orientados a objetos llevan este concepto al siguiente nivel, ya que permiten descripciones de clases (conjuntos de objetos) que comparten estructura y comportamiento. Si se hace bien, este principio funciona extremadamente bien y se adapta de forma natural a la forma de hablar y comunicarse que tienen las personas. Las clases no se limitan a clasificar objetos concretos (como coches), sino que tambin se pueden usar para clasificar objetos abstractos (como tiempo). No obstante, a la hora de clasificar objetos abstractos los lmites se hacen ms imprecisos y el diseo se convierte en algo importante.

Fundamentos de la programacin orientada a objetos

El nico requisito real que debe cumplir una clase es estimular la comunicacin.

Fundamentos de la programacin orientada a objetos

Qu es un objeto?
Objetivo del tema
Definir el trmino objeto.

Explicacin previa

A menudo se comete el error de usar los trminos clase y objeto como si significaran lo mismo, cuando en realidad son dos conceptos muy diferentes.

Un objeto es una instancia de una clase Los objetos se caracterizan por: Identidad: Los objetos se distinguen unos de otros Comportamiento: Los objetos pueden realizar tareas Estado: Los objetos contienen informacin

Fundamentos de la programacin orientada a objetos

Recomendacin al profesor

Puede emplear la analoga del coche a lo largo de toda la explicacin de identidad, comportamiento y estado. Por ejemplo, puede preguntar a los estudiantes si esta frase se refiere a los coches como objetos o como una clase: "El carril de lentos, que es el derecho, es para coches con ms de tres ocupantes." Esta frase usa "coche" como un objeto (una instancia de una clase). Los objetos pueden ser annimos, pero no por ello dejan de ser objetos. El hecho de que un coche lleve a tres personas no lo convierte en un objeto distinto de un coche que lleve a dos o cuatro personas. El nmero de ocupantes es un ejemplo del estado del coche. Explique que estado se refiere a los valores de los atributos internos de un objeto que pueden variar con el tiempo, como el nmero de pasajeros. Compare esto con los valores que probablemente estn fijos y no cambien desde la fabricacin del coche, como el nmero de puertas.

La palabra coche significa distintas cosas segn el contexto. A veces usamos la palabra coche para referirnos al concepto general de coche: hablamos de coche como una clase, la del conjunto de todos los coches, sin pensar en ningn tipo de coche concreto. En otras ocasiones empleamos la palabra coche para hablar de un coche en particular. Los programadores usan el trmino objeto o instancia para referirse a un coche concreto. Es importante entender esta diferencia. Los objetos se pueden comprender mejor con las tres caractersticas de identidad, comportamiento y estado.

Identidad
La identidad es la caracterstica que distingue un objeto de todos los dems objetos de la misma clase. Por ejemplo, imaginemos que dos vecinos tienen coches que son exactamente de la misma marca, modelo y color. A pesar de lo mucho que se puedan parecer, podemos estar seguros de que sus matrculas sern diferentes y reflejarn la identidad de cada uno de los coches. La ley dice que es necesario poder distinguir un objeto coche de otro. (Cmo les ira a los seguros de automviles si los coches no tuvieran identidad?)

Fundamentos de la programacin orientada a objetos

Comportamiento
El comportamiento es la caracterstica que hace que los objetos sean tiles. Los objetos existen para que se comporten de una cierta manera. La mayor parte del tiempo podemos olvidarnos de cmo funciona un coche y pensar slo en su comportamiento externo o de alto nivel. Los coches nos son tiles porque podemos conducirlos; tienen un mecanismo interno, pero nos resulta casi inaccesible. Lo que s es accesible es el comportamiento del objeto, que es adems el factor determinante para su clasificacin. Los objetos de una misma clase comparten un comportamiento comn: Un coche es un coche porque podemos conducirlo, un bolgrafo es un bolgrafo porque podemos usarlo para escribir.

Estado
El estado se refiere a los mecanismos internos de un objeto que hacen que se comporte de una determinada manera. Un objeto bien diseado mantiene su estado inaccesible. Esto guarda una relacin muy estrecha con los conceptos de abstraccin y encapsulacin. No nos preocupa por qu un objeto hace lo que hace, slo queremos que lo haga. Es posible que dos objetos tengan el mismo estado, pero siguen siendo dos objetos diferentes; por ejemplo, dos gemelos idnticos tienen exactamente el mismo estado (su ADN), pero son dos personas distintas.

Fundamentos de la programacin orientada a objetos

Comparacin de clases y estructuras


Objetivo del tema
Ofrecer una breve comparacin entre clases y estructuras.

Una estructura define un valor Sin identidad, estado accesible, sin comportamiento aadido Una clase define un objeto Identidad, estado inaccesible, comportamiento aadido
struct Time struct Time { { public int hour; public int hour; public int minute; public int minute; } } class BankAccount class BankAccount { { ... ... ... ... } }

Explicacin previa

Tal vez sepa ya que las estructuras pueden contener mtodos y datos, igual que las clases. Cul es entonces la diferencia entre una estructura y una clase?

Recomendacin al profesor

Estructuras
Una estructura, como Reloj en el ejemplo, no tiene identidad. Si dos variables Reloj representan las 12:30, el programa se comportar exactamente de la misma manera independientemente de cul de ellas utilicemos. Las entidades de software sin identidad se llaman valores. Los tipos predefinidos descritos en el Mdulo 3, Uso de variables de tipo valor, en el Curso 2124C, Programacin en C#, como int, bool, decimal y todos los tipos struct, se llaman en C# tipos de valor. Las variables del tipo struct pueden contener mtodos, aunque es preferible que no lo hagan. Idealmente, deben contener slo datos. Por otra parte, no hay ningn problema en definir operadores en estructuras. Los operadores son un tipo de mtodos que no aaden nada al comportamiento, sino slo una sintaxis ms concisa para un mismo comportamiento.

En programas C++, las palabras reservadas struct y class se pueden usar indistintamente. Haga hincapi en que, en C#, las clases no son un tipo de "sper estructuras."

Clases
Una clase, como CuentaBancaria en el ejemplo, tiene identidad. Si hay dos objetos CuentaBancaria, el programa se comportar de distinta forma dependiendo de cul se utilice. Las entidades de software con identidad se llaman objetos (en ocasiones, las variables del tipo struct reciben tambin el nombre de objetos, pero estrictamente hablando son valores). Los tipos representados por clases se llaman en C# tipos de referencia. A diferencia de las estructuras, en una clase bien diseada no se debe ver nada que no sea un mtodo. Estos mtodos aaden comportamiento de alto nivel al comportamiento primitivo que existe a nivel de los datos inaccesibles.

Fundamentos de la programacin orientada a objetos

Tipos de valor y tipos de referencia


Los tipos de valor son los que se encuentran en el nivel ms bajo de un programa. Son los elementos que se utilizan para crear entidades de software ms grandes. Los tipos de valor se pueden copiar libremente y estn en la pila como variables locales o como atributos dentro de los objetos que describen. Los tipos de referencia son los que se encuentran en el nivel ms alto de un programa. Se crean a partir de entidades de software ms pequeas. Normalmente los tipos de referencia no se pueden copiar y estn en el montn (heap).

Fundamentos de la programacin orientada a objetos

10

Abstraccin
Objetivo del tema
Definir la abstraccin.

Explicacin previa

Es necesario saber cmo funciona una cosa para poder usarla?

La abstraccin es ignorancia selectiva Decidir qu es importante y qu no lo es Concentrarse en lo importante y depender de ello Ignorar lo que no es importante y no depender de ello Usar encapsulacin para forzar una abstraccin
El objetivo de la abstraccin es no perderse en vaguedades y crear El objetivo de la abstraccin es no perderse en vaguedades y crear un nuevo nivel semntico en el que se pueda ser absolutamente preciso. un nuevo nivel semntico en el que se pueda ser absolutamente preciso. Edsger Dijkstra Edsger Dijkstra

Recomendacin al profesor

La abstraccin es la tctica de despojar una idea u objeto de todo lo innecesario hasta llegar a su forma mnima y esencial. Una buena abstraccin elimina los detalles poco importantes y permite concentrarse slo en lo que es importante. La abstraccin es un importante principio del software. Una clase bien diseada deja ver una cantidad mnima de mtodos que permiten obtener fcilmente el comportamiento esencial de la clase. Desgraciadamente, crear buenas abstracciones de software no es sencillo. Para llegar a una buena abstraccin suele ser necesario tener un profundo conocimiento del problema y de su contexto, pensar con gran claridad y tener una enorme experiencia.

Los contenidos de la transparencia tienen implicaciones importantes. Lo primero que se dice es que hay que decidir qu es importante y qu no lo es. En otras palabras, hay que tomar decisiones de diseo. Dado el nivel de este curso, dedique poco o ningn tiempo a discutir este tema. Concntrese ms bien en la dependencia, que guarda una relacin muy estrecha con la idea de cambio (que se discute a continuacin).

Dependencia mnima
Las mejores abstracciones de software hacen que las cosas ms complejas parezcan sencillas. Para ello ocultan todos los aspectos de una clase que no son esenciales. Una vez ocultos, estos aspectos ya no pueden ser vistos ni utilizados y no se depende de ellos de ninguna manera. Este principio de dependencia mnima es lo que hace que la abstraccin sea tan importante. Una de las pocas cosas seguras en el desarrollo de software es que siempre es necesario cambiar el cdigo. La comprensin perfecta slo se alcanza (si es que se consigue) al final del proceso de desarrollo; las primeras decisiones se toman a partir de una comprensin incompleta del problema, por lo que siempre hay que reconsiderarlas ms tarde. Las especificaciones tambin cambian a medida que se va entendiendo mejor el problema. Las versiones posteriores incluyen cada vez ms funciones. Los cambios son normales en el desarrollo de software; lo ms que podemos hacer cuando se producen es minimizar sus efectos, y cuanto menos dependamos de una cosa, menos nos afectarn sus cambios.

Fundamentos de la programacin orientada a objetos

11

Citas ilustrativas
He aqu algunas citas para ilustrar el principio de dependencia mnima que hace que la abstraccin sea tan importante: Para su informacin Cuanto ms perfecta es una mquina, ms invisible resulta tras su funcin. Es como si la perfeccin se alcanzara no cuando ya no hay nada ms que aadir, sino cuando ya no queda nada que eliminar. En la cima de su evolucin, la mquina queda totalmente oculta. Antoine de Saint-Exupry, Viento, arena y estrellas Podramos definir el minimum como la perfeccin que alcanza un objeto cuando ya resulta imposible mejorarlo por substraccin. sta es la calidad que define a un objeto cuando todos y cada uno de sus componentes, detalles y conexiones han sido reducidos o condensados a lo esencial. Es el resultado de la omisin de lo innecesario. John Pawson, Minimum El objetivo bsico de la comunicacin es la claridad y la simplicidad. La simplicidad es el resultado de un esfuerzo bien enfocado. Edward de Bono, Simplicidad

La cita de Dijkstra se puede usar para intentar desmontar un mito muy extendido; no hay nada vago en una abstraccin de software. Tanto usted como sus estudiantes pueden encontrar ms informacin sobre el profesor Edsger Wybe Dijkstra en www.cs.utexas.edu/users/ UTCS/report/1994/profiles/ dijkstra.html Entre sus contribuciones a la informtica y las matemticas estn los semforos informticos; sus famosos nombres "P y V" para los semforos proceden de las palabras holandesas passeer y verlaat, o pasar y salir. Tambin se dio su nombre al algoritmo de Dijkstra, que encuentra la ruta ms corta desde un punto de un grfico hasta su destino.

Fundamentos de la programacin orientada a objetos

12

Uso de la encapsulacin
Objetivo del tema
Ofrecer una introduccin a los temas tratados en esta seccin.

Combinacin de datos y mtodos Control de la visibilidad de acceso Por qu se encapsula? Datos de objetos Uso de datos estticos Uso de mtodos estticos

Explicacin previa

Qu es la encapsulacin? Cmo se puede emplear la encapsulacin en una clase, y por qu?

Al final de esta leccin, usted ser capaz de: Combinar datos y mtodos en una sola cpsula. Usar encapsulacin dentro de una clase. Usar mtodos de datos estticos en una clase.

Fundamentos de la programacin orientada a objetos

13

Combinacin de datos y mtodos


Objetivo del tema
Discutir la motivacin que hay detrs de la encapsulacin.

Combinacin de datos y mtodos en una sola cpsula La frontera de la cpsula crea un espacio interior y otro exterior

Explicacin previa

Despus de decidir qu partes pueden ser de acceso pblico y cules deben quedar ocultas, es preciso contar con una forma sencilla de ocultar la complejidad interna de una clase.

Retirar( ) saldo Ingresar( ) CuentaBancaria ?

Retirar( ) saldo Ingresar( ) CuentaBancaria ?

La encapsulacin incluye dos aspectos importantes: Combinacin de datos y funciones en una sola entidad (esta transparencia) Control de la accesibilidad a los miembros de la entidad (siguiente transparencia) Recomendacin al profesor

Programacin procedural
Los programas procedurales tradicionales, escritos en lenguajes como C, contienen fundamentalmente una gran cantidad de datos y muchas funciones, y cada funcin puede acceder a todos los datos. Este mtodo con un nivel tan alto de asociacin puede funcionar bien en un programa pequeo, pero se hace cada vez menos conveniente a medida que crece el programa. Un cambio en la representacin de los datos puede resultar catico, ya que har que fallen todas las funciones que usan los datos modificados (y que por tanto dependen de ellos). Los cambios son ms complicados a medida que el programa se hace ms grande y, por tanto, ms frgil y menos estable. La separacin de datos y funciones no se mantiene al cambiar la escala del programa. Esto dificulta los cambios y, como saben todos los desarrolladores de software, el cambio es la nica constante. La separacin de datos y funciones plantea otro serio problema. En trminos de abstraccin de comportamientos a alto nivel, esta tcnica no corresponde a la forma de pensar de los humanos. Puesto que los programas estn escritos por personas, es mucho mejor utilizar un modelo de programacin que se aproxime a la forma en que las personas piensan y no a la forma en que estn fabricados los sistemas informticos.

La transparencia termina recomendando el uso de la encapsulacin para forzar la abstraccin. sta es la primera de dos transparencias sobre encapsulacin. La segunda transparencia proporciona informacin adicional. En esta transparencia se hace hincapi en la palabra cpsula porque de ella se deriva la palabra encapsulacin. Observe que la figura de la izquierda lleva un signo de interrogacin. Esto se debe a que no existe ningn elemento individual e independiente que represente la cuenta bancaria.

Fundamentos de la programacin orientada a objetos

14

Programacin orientada a objetos


La programacin orientada a objetos surgi para resolver estos problemas en la medida de lo posible. Si se entiende y se utiliza debidamente, la programacin orientada a objetos puede llegar a ser realmente una programacin orientada a personas, puesto que los humanos tendemos de forma natural a pensar y trabajar en trminos del comportamiento de objetos a alto nivel. El paso primero y ms importante para pasar de la programacin procedural a la programacin orientada a objetos consiste en combinar los datos y las funciones en una sola entidad.

Fundamentos de la programacin orientada a objetos

15

Control de la visibilidad de acceso


Explicar cmo se puede llevar a la prctica la encapsulacin.

Objetivo del tema

Los mtodos son pblicos, accesibles desde el exterior Los datos son privados, accesibles slo desde el interior

Explicacin previa

Despus de decidir qu partes van a quedar ocultas del mundo exterior, cmo podemos asegurarnos de que nadie podr ver cmo funcionan las clases?

Retirar( ) saldo Ingresar( ) CuentaBancaria ?

Retirar( ) saldo Ingresar( ) CuentaBancaria ?

Recomendacin al profesor

Esta transparencia explica el segundo aspecto de la encapsulacin. Observe que la figura de la izquierda lleva un signo de interrogacin. Esto se debe a que en la vida real uno no tiene acceso directo a su saldo bancario. La figura de la derecha modifica la frontera de forma que el saldo queda en la parte interior. Como esto corresponde a las cuentas bancarias reales, no se ha utilizado signo de interrogacin.

En la figura de la izquierda, Retirar, Ingresar y saldo han sido agrupadas dentro de una cpsula. La transparencia sugiere que el nombre de la cpsula es CuentaBancaria. Sin embargo, hay algo que no funciona en este modelo de cuenta bancaria: el dato saldo es accesible (si en la realidad se pudiera acceder directamente al saldo de una cuenta bancaria, sera posible aumentarlo sin hacer ningn ingreso). Las cuentas bancarias no funcionan de este modo, lo que quiere decir que hay una mala correspondencia entre el problema y su modelo. La encapsulacin permite resolver este problema. Una vez se han combinado datos y funciones en una sola entidad, sta forma una frontera cerrada que crea de forma natural un espacio interior y otro exterior. Esta frontera se puede utilizar para controlar de forma selectiva la accesibilidad de las entidades: algunas sern accesibles desde el interior y el exterior, mientras que a otras slo ser posible acceder desde el interior. Los miembros que son siempre accesibles se denominan pblicos, mientras que aquellos a los que slo se puede acceder desde el interior son privados. Para que el modelo de una cuenta bancaria se aproxime ms a la realidad, se puede hacer que saldo sea privado y que los mtodos Retirar e Ingresar sean pblicos. De esta forma, la nica manera de aumentar el saldo desde el exterior es ingresar dinero en la cuenta. Como se ve, Ingresar est en el interior y por tanto puede acceder a saldo.

Fundamentos de la programacin orientada a objetos

16

Como muchos otros lenguajes de programacin orientados a objetos, C# da completa libertad a la hora de elegir qu miembros deben ser accesibles. Es posible crear datos pblicos siempre que se desee. No obstante, se recomienda marcar los datos siempre como privados (esta recomendacin se convierte en obligatoria en algunos lenguajes de programacin). Los tipos cuya representacin de datos es completamente privada se llaman tipos de datos abstractos (ADT). Son abstractos en el sentido de que no es posible acceder a la representacin de datos privada (ni depender de ella); slo se pueden usar los mtodos de comportamiento. En cierto modo, los tipos predefinidos como int tambin son ADT. Para sumar dos variables enteras no es necesario conocer la representacin binaria interna de cada valor entero; tan slo hay que saber el nombre del mtodo que hace sumas: el operador de suma (+). Cuando se forman miembros accesibles (pblicos), es posible crear distintas vistas de una misma entidad. La vista desde el exterior es un subconjunto de la vista desde el interior. Una vista restringida est muy prxima a la idea de abstraccin: desnudar la idea para quedarse con lo esencial. La decisin de si algo debe quedar dentro o fuera implica una gran cantidad de diseo. Cuantas ms caractersticas queden en el interior (y se puedan seguir utilizando), tanto mejor.

Fundamentos de la programacin orientada a objetos

17

Por qu se encapsula?
Objetivo del tema
Explicar cmo se puede usar la encapsulacin para que las aplicaciones sean ms fciles de modificar y mantener.
Retirar( ) Ingresar( ) saldo 12,56

Porque permite el control El objeto se usa slo con los mtodos pblicos Porque permite el cambio El uso del objeto no vara si cambia el tipo de los datos privados

Explicacin previa

Con qu frecuencia cambian los detalles internos de una clase? Es posible cambiar la forma de almacenamiento o procesamiento de la informacin?

Retirar( ) Ingresar( ) euros 12 cntimos 56

Recomendacin al profesor

Hay dos razones para encapsular: Controlar el uso. Minimizar los efectos del cambio.

Esta transparencia presenta el concepto de cambio y los principios fundamentales de la programacin orientada a objetos. No es posible evitar los cambios; lo ms que se puede hacer es trabajar con un lenguaje y un proceso de diseo que minimice sus efectos. Observe que el saldo es de 12,56 en los dos ejemplos de la transparencia (en distintas representaciones).

La encapsulacin permite el control


Controlar el uso es el primer motivo para encapsular. Cuando conducimos un coche pensamos nicamente en el acto de conducir, no en los aspectos internos del coche. Si retiramos dinero de una cuenta, no nos planteamos cmo estar representada. La encapsulacin y los mtodos de comportamiento sirven para disear objetos de software que funcionan slo como queremos que lo hagan.

La encapsulacin permite el cambio


La segunda razn para encapsular es una consecuencia de la primera. Si el mecanismo de creacin de un objeto es privado, es posible modificarlo de forma que los cambios no afecten directamente a los usuarios del objeto (que slo pueden acceder a los mtodos pblicos). Esto puede ser extremadamente til en la prctica, ya que los nombres de los mtodos se suelen fijar mucho antes de su realizacin. La capacidad de realizar cambios internos est muy relacionada con la abstraccin. Dados dos diseos para una misma clase, por regla general hay que elegir el que tenga menos mtodos pblicos. En otras palabras: Si se puede elegir entre hacer un mtodo pblico o privado, lo mejor es hacerlo privado. Un mtodo privado se puede cambiar libremente y ms tarde, tal vez, convertirlo en un mtodo pblico. Por el contrario, no es posible convertir un mtodo pblico en privado sin romper el cdigo cliente.

Fundamentos de la programacin orientada a objetos

18

Datos de objetos
Objetivo del tema
Discutir aspectos relacionados con datos de objetos privados.

Explicacin previa

Los datos de objetos describen informacin para objetos concretos Por ejemplo, cada cuenta bancaria tiene su propio saldo. Si dos cuentas tienen el mismo saldo, ser slo una coincidencia .
Retirar( ) Ingresar( ) saldo 12,56 prop. Juan" Retirar( ) Ingresar( ) saldo prop. 12,56 Pedro"

Es necesario que objetos de la misma clase compartan sus datos? Normalmente no lo hacen.

La mayor parte de los datos dentro de un objeto describen informacin sobre ese objeto concreto. Por ejemplo, cada cuenta bancaria tiene su propio saldo. Por supuesto, es perfectamente posible que haya muchas cuentas bancarias con el mismo saldo, pero eso ser slo una coincidencia. Un dato de un objeto es privado y slo los mtodos del objeto pueden acceder a l. Esta encapsulacin y separacin significa que, en la prctica, un objeto es una entidad autnoma.

Fundamentos de la programacin orientada a objetos

19

Uso de datos estticos


Objetivo del tema
Explicar cmo los objetos pueden compartir datos privados.

Explicacin previa

Los datos estticos describen informacin para todos los objetos de una clase Por ejemplo, supongamos que todas las cuentas comparten el mismo inters. No sera conveniente almacenar el inters en todas las cuentas. Por qu?
Retirar( ) Ingresar( ) saldo 12,56 inters 7% Retirar( ) Ingresar( ) saldo 99,12

Ocasionalmente es necesario que objetos de la misma clase compartan datos.

inters 7%

Hay veces en que no tiene sentido almacenar informacin dentro de cada objeto. Si todas las cuentas bancarias comparten siempre el mismo inters, por ejemplo, almacenar el inters dentro de cada objeto cuenta no sera conveniente por los siguientes motivos: Recomendacin al profesor Es una forma poco eficaz de resolver el problema tal como est planteado: Todas las cuentas bancarias comparten el mismo inters. Aumenta innecesariamente el tamao de cada objeto, utilizando ms memoria cuando se ejecuta el programa y ms espacio en disco cada vez que se guarda. Hace difcil cambiar el inters, ya que habra que modificarlo en todos y cada uno de los objetos cuenta y eso podra hacer imposible acceder a las cuentas durante el cambio. Aumenta el tamao de la clase. El dato privado de inters necesitara mtodos pblicos, por lo que la clase cuenta se hara menos compacta y no funcionara todo lo bien que debiera. Para resolver este problema no se debe compartir a nivel de objeto informacin que sea comn a varios objetos. En lugar de describir el inters muchas veces a nivel de objeto, es mucho mejor describirlo una sola vez a nivel de clase. El inters definido a nivel de clase se convierte en la prctica en un dato global. Pero los datos globales, por definicin, no se almacenan dentro de una clase, y por lo tanto no pueden ser encapsulados. A causa de esto, muchos lenguajes de programacin orientados a objetos (incluyendo C#) no permiten los datos globales. En su lugar permiten describir datos como estticos.

El inters se muestra en la transparencia como dato de objeto. La "X" roja indica que no es una buena idea. El segundo ejercicio de la prctica pide a los estudiantes que creen datos y mtodos estticos.

Fundamentos de la programacin orientada a objetos

20

Declaracin de datos estticos


Un dato esttico (static) se define fsicamente dentro de una clase (que es una entidad esttica de tiempo de compilacin) y se beneficia de la encapsulacin de sta, pero lgicamente est asociado a la clase y no a un objeto concreto. En otras palabras, un dato esttico se declara dentro de una clase por conveniencia sintctica y existe aunque el programa nunca cree objetos de esa clase.

Fundamentos de la programacin orientada a objetos

21

Uso de mtodos estticos


Describir los mtodos estticos.

Objetivo del tema

Explicacin previa

Los mtodos estticos acceden slo a datos estticos Un mtodo esttico se llama en la clase, no el objeto
La clase cuenta Inters( ) Un objeto cuenta Retirar( ) Ingresar( ) saldo inters 7% Las clases contienen datos y mtodos estticos prop. 99,12 Pedro"

Si el inters pertenece a la clase cuenta en lugar de a un objeto cuenta concreto, y si se utiliza encapsulacin para ocultar la representacin interna del inters, cmo se puede acceder al inters o modificarlo?

Los objetos contienen datos y mtodos de objetos

Para encapsular datos estticos se pueden utilizar mtodos estticos. En el ejemplo de la transparencia, el inters pertenece a la clase cuenta y no a un objeto cuenta concreto. Por lo tanto, tiene sentido que a nivel de clase haya mtodos que se puedan emplear para acceder al inters o modificarlo. Es posible declarar mtodos como estticos de la misma forma que se declara un dato esttico. Los mtodos estticos existen a nivel de clase. La accesibilidad de mtodos y datos estticos se puede controlar con modificadores como public (pblico) y private (privado). Mtodos estticos pblicos con datos estticos privados permiten encapsular datos estticos del mismo modo que se encapsulan datos de objetos. Un mtodo esttico existe a nivel de clase y las llamadas a ese mtodo se hacen con referencia a la clase, no a un objeto. Esto significa que un mtodo esttico no puede utilizar el operador this, que implcitamente apunta al objeto que hace una llamada a un mtodo de objeto. En otras palabras, un mtodo esttico no puede acceder a datos o mtodos que no sean estticos. Los nicos miembros de una clase a los que puede acceder un mtodo esttico son datos estticos y otros mtodos estticos.

Fundamentos de la programacin orientada a objetos

22

Los mtodos estticos siguen teniendo acceso a todos los miembros privados de una clase y pueden acceder a datos privados no estticos por medio de una referencia a objeto. El siguiente cdigo muestra un ejemplo:
class Reloj { ... public static void Reset(Reloj t) { t.hora = 0; // Okay t.minuto = 0; // Okay hora = 0; // error al compilar minuto = 0; // error al compilar } private int hora, minuto; }

Fundamentos de la programacin orientada a objetos

23

El lenguaje C# y la orientacin a objetos


Objetivo del tema
Ofrecer una introduccin a los temas tratados en esta seccin.

Hola, mundo de nuevo Definicin de clases simples Instancias de nuevos objetos Uso del operador this

Explicacin previa

Ahora que hemos visto parte de la teora que hay detrs de la orientacin a objetos, vamos a ver cmo se utiliza en C#.

En esta seccin volveremos a examinar el programa Hola, mundo original y explicaremos su estructura desde una perspectiva orientada a objetos. Al final de esta leccin, usted ser capaz de: Usar los mecanismos que hacen que un objeto pueda crear otro en C#. Definir clases anidadas.

Fundamentos de la programacin orientada a objetos

24

Hola, mundo de nuevo


Objetivo del tema
Explicar cmo se invoca Main cuando se ejecuta una aplicacin.

Explicacin previa

using System; using System; class Hello class Hello { { public static int Main( ) public static int Main( ) { { Console.WriteLine(Hello, World); Console.WriteLine(Hello, World); return 0; return 0; } } } }

Un programa C# es una clase que tiene un mtodo esttico llamado Main. Por qu?

La transparencia muestra el cdigo para Hola, mundo. Podemos hacer y contestar varias preguntas: Cmo invoca una clase el runtime? Por qu Main es esttico?

Cmo invoca una clase el runtime?


Si slo hay un mtodo Main, el compilador lo interpretar automticamente como el punto de entrada al programa. El siguiente cdigo muestra un ejemplo:
// UnaEntrada.cs class UnaEntrada { static void Main( ) { ... } } // fin del archivo c:\> csc UnaEntrada.cs

Aviso El punto de entrada a un programa C# debe ser Main con una M mayscula. La signatura de Main tambin es importante.

Fundamentos de la programacin orientada a objetos

25

Si, por el contrario, existen varios mtodos llamados Main, es necesario que uno de ellos est designado explcitamente como punto de entrada al programa (y que ese Main tambin sea pblico explcitamente). El siguiente cdigo muestra un ejemplo:
// DosEntradas.cs using System; class EntradaUno { public static void Main( ) { Console.Write("EntradaUno.Main( )"); } } class EntradaDos { public static void Main( ) { Console.Write("EntradaDos.Main( )"); } } // Fin del archivo c:\> csc /main:EntradaUno DosEntradas.cs c:\> dosentradas.exe EntradaUno.Main( ) c:\> csc /main:EntradaDos DosEntradas.cs c:\> dosentradas.exe EntradaDos.Main( ) c:\>

La opcin de lnea de comandos distingue maysculas y minsculas. Si el nombre de la clase que contiene Main es EntradaUno (con E y O maysculas), el siguiente comando no funcionar:
c:\> csc /main:entradauno DosEntradas.cs

Fundamentos de la programacin orientada a objetos

26

No se puede crear un programa ejecutable si el proyecto no contiene ningn mtodo Main. Sin embargo, es posible crear una biblioteca de vnculos dinmicos (DLL) de la siguiente manera:
// SinEntrada.cs using System; class SinEntrada { public static void NoMain( ) { Console.Write("SinEntrada.NoMain( )"); } } // Fin del archivo c:\> csc /target:library SinEntrada.cs c:\> dir ... SinEntrada.dll ...

Por qu Main es esttico?


El hecho de que Main sea esttico hace que sea posible invocarlo sin que el runtime tenga que crear una instancia de la clase. Las llamadas a mtodos no estticos slo pueden estar en un objeto, como se ve en el siguiente cdigo:
class Ejemplo { void NonStatic( ) { ... } static void Main( ) { Ejemplo eg = new Example( ); eg.NonStatic( ); // Compila NonStatic( ); // error al compilar } ... }

Esto significa que si Main no es esttico, como en el siguiente cdigo, el runtime necesita crear un objeto para hacer una llamada a Main.
class Ejemplo { void Main( ) { ... }

} En otras palabras, en la prctica el runtime tendra que ejecutar el siguiente cdigo:


Ejemplo ejecuta = new Example( ); ejecuta.Main( );

Fundamentos de la programacin orientada a objetos

27

Definicin de clases simples


Objetivo del tema
Describir la sintaxis bsica para la definicin de clases.

Explicacin previa

Datos y mtodos juntos dentro de una clase Los mtodos son pblicos, los datos son privados
class BankAccount class BankAccount Mtodos pblicos Mtodos pblicos { { describen un describen un public void Withdraw(decimal cantidad) comportamiento public void Withdraw(decimal cantidad) comportamiento { ... } accesible accesible { ... } public void Deposit(decimal cantidad) public void Deposit(decimal cantidad) Campos privados { ... } Campos privados { ... } describen un describen un private decimal balance; private decimal balance; estado estado private string name; private string name; inaccesible inaccesible } }

Ya sabemos qu son las clases. Ahora tenemos que saber cmo se definen.

A pesar de ser distintas semnticamente, las clases y estructuras tienen algunos parecidos sintcticos. Para definir una clase en vez de una estructura: Se usa la palabra reservada class en lugar de struct. Los datos se declaran dentro de la clase exactamente igual que para una estructura. Los mtodos se declaran dentro de la clase. Se aaden modificadores de acceso a las declaraciones de los datos y mtodos. Los dos modificadores de acceso ms sencillos son public y private (los otros tres se discutirn ms adelante en este curso). Nota El uso de public y private para forzar la encapsulacin es responsabilidad del programador. C# no impide la creacin de datos pblicos. El significado de public es acceso sin limitaciones, mientras que private quiere decir acceso limitado al tipo que lo contiene. El siguiente ejemplo aclara este punto:
class CuentaBancaria { public void Ingresar(decimal cantidad) { saldo += cantidad; } private decimal saldo; }

Fundamentos de la programacin orientada a objetos

28

En este ejemplo, el mtodo Ingresar puede acceder al saldo privado porque Ingresar es un mtodo de CuentaBancaria (el tipo que contiene saldo). En otras palabras, Ingresar est en la parte de dentro. Desde el exterior nunca es posible acceder a miembros privados. En el siguiente ejemplo no se compilar la expresin cuentaAtacada.saldo.
class LadronDeBancos { public void RobarDe(CuentaBancaria cuentaAtacada) { cuentaAtacada.saldo -= 999999M; } }

La expresin cuentaAtacada.saldo no se compilar porque est dentro del mtodo RobarDe de la clase LadronDeBancos. Slo los mtodos de la clase CuentaBancaria pueden acceder a miembros privados de objetos de CuentaBancaria. Para declarar datos estticos se sigue el mismo patrn que para mtodos estticos (como Main), poniendo la palabra reservada static antes de la declaracin del campo. El siguiente cdigo muestra un ejemplo:
class CuentaBancaria { public void Ingresar(decimal cantidad) { ... } public static void Main( ) { ... } ... private decimal saldo; private static decimal inters; }

Fundamentos de la programacin orientada a objetos

29

Un miembro de una clase para el que no especifique ningn modificador de acceso ser privado por defecto. En otras palabras, los dos mtodos siguientes son idnticos semnticamente:
class CuentaBancaria { ... decimal saldo; } class CuentaBancaria { ... private decimal saldo; }

Consejos Aunque no sea estrictamente necesario, se considera una buena prctica de programacin escribir private explcitamente. El orden en que se declaran los miembros de una clase no tiene importancia para el compilador de C#. Sin embargo, se considera una buena prctica de programacin declarar los miembros pblicos (mtodos) antes que los privados (datos). Esto se debe a que el usuario de una clase slo tiene acceso a los miembros pblicos, por lo que declarar estos antes que los privados refleja esa prioridad.

Fundamentos de la programacin orientada a objetos

30

Instancias de nuevos objetos


Presentar el operador new.

Objetivo del tema

Explicacin previa

Antes de crear un objeto, es preciso crear una instancia de l.

Al declarar una variable de clase no se crea un objeto Para crear un objeto se usa el operador new
class Program class Program ahora hora { minuto { static void Main( ) static void Main( ) nuevo suya { ... objeto { ... CuentaBancaria Reloj ahora; Reloj ahora; ahora.hora = 11; ahora.hora = 11; Cuenta Bancaria suya = new CuentaBancaria( ); Cuenta Bancaria suya = new CuentaBancaria( ); suya.Ingresar(999999M); suya.Ingresar(999999M); } } } }

Consideremos los siguientes cdigos de ejemplo:


struct Reloj { public int hora, minuto; } class Programa { static void Main( ) { Reloj ahora; ahora.hora = 11; ahora.minuto = 59; ... } }

Recomendacin al profesor

El primer ejercicio de la prctica hace hincapi en la diferencia entre estructuras y clases y utiliza el operador new para crear objetos.

Las variables del tipo struct son tipos de valor. Esto quiere decir que, cuando se declara una variable de estructura (como ahora en Main), se crea un valor en la pila. En este caso, la estructura Reloj contiene dos ints, por lo que la declaracin de ahora crea dos ints en la pila, una llamada ahora.hora y otra ahora.minuto. Estos dos ints NO se inicializan a cero por defecto. Por eso no es posible leer el valor de ahora.hora ni de ahora.minuto hasta que se les asigna un valor. Los valores slo tienen validez en el bloque en el que se declaran. En este ejemplo, el mbito de ahora es Main. Esto significa que cuando el flujo de control abandona Main (por un return normal o porque se ha lanzado una excepcin), ahora quedar fuera de mbito y dejar de existir.

Fundamentos de la programacin orientada a objetos

31

Las clases son totalmente distintas, como muestra el siguiente cdigo:


class Reloj // NOTA: Reloj es ahora una clase { public int hora, minuto; } class Programa { static void Main( ) { Reloj ahora; ahora.hora = 11; ahora.minuto = 59; ... } }

Cuando se declara una variable de clase, no se crea una instancia u objeto de esa clase. En este caso, la declaracin de ahora no crea un objeto de la clase Reloj. Al declarar una variable de clase se crea una referencia que puede apuntar a un objeto de esa clase. Por esta razn las clases se llaman tipos de referencia. Esto significa que, si el runtime ejecutara el cdigo anterior, intentara acceder a los enteros dentro de un objeto Reloj que no existe. Afortunadamente, el compilador avisara de este error con el siguiente mensaje:
error CS0165: Uso de variable local no asignada 'ahora'

Para corregir este error es necesario crear un objeto Reloj (usando la palabra reservada new) y hacer que la variable de referencia ahora apunte al objeto recin creado, como en el siguiente cdigo:
class Programa { static void Main( ) { Reloj ahora = new Reloj( ); ahora.hora = 11; ahora.minuto = 59; ... } }

Fundamentos de la programacin orientada a objetos

32

Recordemos que, cuando se crea un valor de estructura local en la pila, los campos NO se inicializan a cero por defecto. Las clases son diferentes: cuando se crea un objeto como una instancia de una clase, como anteriormente, los campos del objeto se inicializan a cero por defecto. El siguiente cdigo se compilar sin errores:
class Programa { static void Main( ) { Reloj ahora = new Reloj( ); Console.WriteLine(ahora.hora); // escribe 0 Console.WriteLine(ahora.minuto); // escribe 0 ... } }

Fundamentos de la programacin orientada a objetos

33

Uso de la palabra reservada this


Objetivo del tema
Describir el operador this.

Explicacin previa

Los mtodos dentro de una clase tienen que poder apuntar a la instancia actual de la clase.

La palabra reservada this apunta al objeto usado para la llamada al mtodo Es til en caso de conflicto entre identificadores de distintos mbitos
class CuentaBancaria class CuentaBancaria { { ... ... public void PoneNombre(string nombre) public void PoneNombre(string nombre) Si esta instruccin fuera { { nombre = nombre; this.nombre = nombre; this.nombre = nombre; qu ocurrira? } } private string nombre; private string nombre; } }

La palabra reservada this apunta implcitamente al objeto que est haciendo una llamada a un mtodo de objeto. En el siguiente cdigo, la instruccin nombre = nombre no tendra ningn efecto, ya que el identificador nombre en el lado izquierdo de la asignacin no se corresponde al campo privado de CuentaBancaria llamado nombre. Los dos identificadores se refieren al parmetro del mtodo, que tambin se llama nombre.
class CuentaBancaria { public void PoneNombre(string nombre) { nombre = nombre; } private string nombre; }

Aviso El compilador de C# no emite un aviso para alertar de este error.

Uso de la palabra reservada this


Este problema de referencia se puede resolver con la palabra reservada this, como se ve en la transparencia. La palabra reservada this apunta al objeto actual para el que se hace la llamada al mtodo. Nota Los mtodos estticos no pueden usar this, puesto que no se les llama empleando un objeto.

Fundamentos de la programacin orientada a objetos

34

Cambio del nombre del parmetro


Tambin es posible resolver el problema de referencia cambiando el nombre del parmetro, como en el siguiente ejemplo:
class CuentaBancaria { public void PoneNombre(string nuevoNombre) { nombre = nuevoNombre; } private string nombre; }

Consejo En C# es muy habitual usar this para escribir constructores. El siguiente cdigo muestra un ejemplo:
struct Reloj { public Reloj(int hora, int minuto) { this.hora = hora; this.minuto = minuto; } private int hora, minuto; }

Fundamentos de la programacin orientada a objetos

35

Consejo La palabra clave this se usa tambin para encadenar llamadas. En la siguiente clase, los dos mtodos devuelven el objeto que ha hecho la llamada:
class Libro { public Libro PoneAutor(string autor) { this.autor = autor; return this; } public Libro PoneTitulo(string titulo) { this.titulo = titulo; return this; } private string autor, titulo; }

La devolucin de this permite encadenar llamadas a mtodos, como se muestra a continuacin:


class Uso { static void Cadena(Libro bueno) { bueno.PoneAutor(" Fowler").PoneTitulo(" Refactoring"); } static void NoCadena(Libro bueno) { bueno.PoneAutor("Fowler"); bueno.PoneTitulo (" Refactoring"); } }

Nota Un mtodo esttico existe a nivel de clase y las llamadas a l se hacen en referencia a la clase y no a un objeto. Esto significa que un mtodo esttico no puede usar el operador this.

Fundamentos de la programacin orientada a objetos

36

Definicin de sistemas orientados a objetos


Objetivo del tema
Ofrecer una introduccin a los temas tratados en esta seccin.

Herencia Jerarquas de clases Herencia sencilla y mltiple Polimorfismo Clases base abstractas Interfaces

Explicacin previa

En esta leccin discutiremos los conceptos de herencia y polimorfismo.

En esta leccin discutiremos los conceptos de herencia y polimorfismo. En mdulos posteriores estudiaremos cmo se utilizan en C# estos conceptos.

Fundamentos de la programacin orientada a objetos

37

Herencia
Objetivo del tema
Explicar el concepto de herencia.

Explicacin previa

La herencia indica una relacin es un tipo de" La herencia es una relacin entre clases Las nuevas clases aaden especializacin a las existentes
Generalizacin

La herencia permite definir nuevas clases a partir de otras ya existentes.

Msico Msico

Clase base

Especializacin

Violinista Violinista

Clase derivada

Es ste un buen ejemplo de herencia ?

Recomendacin al profesor

La transparencia incluye una figura de un hombre, una mujer y una nia pequea en un triciclo. Utilice esta figura como ejemplo de cmo no usar la herencia, tal como se explica en las notas.

La herencia es una relacin especificada a nivel de clase para reflejar el hecho de que una clase nueva puede derivar de otra ya existente. En la transparencia, la clase Violinista deriva de la clase Msico. La clase Msico se denomina clase base (o, con menos frecuencia, la clase padre o superclase), mientras que la clase Violinista recibe el nombre de clase derivada (o tambin la clase hija o subclase). La herencia se indica en notacin de lenguaje unificado de modelado (UML). En transparencias posteriores veremos ms notacin UML. La herencia es una relacin muy poderosa, ya que una clase derivada lo hereda todo de su clase base. Por ejemplo, si la clase base Msico contiene un mtodo llamado AfinaTuInstrumento, este mtodo se convierte automticamente en miembro de la clase derivada Violinista. Una clase base puede tener un nmero arbitrario de clases derivadas. Por ejemplo, de la clase Msico podran derivar otras clases nuevas (como Flautista o Pianista) que tambin heredaran automticamente el mtodo AfinaTuInstrumento de la clase base Msico. Nota Un cambio en la clase base se convierte automticamente en un cambio para todas las clases derivadas. Por ejemplo, si se aadiera un campo o tipo IntrumentoMusical a la clase base Msico, todas las clases derivadas (Violinista, Flautista, Pianista, etc.) adquiriran automticamente un campo o tipo IntrumentoMusical. Un error que aparezca en una clase base se extiende automticamente a todas las clases derivadas (lo que se conoce como problema de clase base frgil).

Fundamentos de la programacin orientada a objetos

38

La herencia en la programacin orientada a objetos


La figura de la transparencia muestra a un hombre, una mujer y una nia pequea montada en un triciclo. Si el hombre y la mujer son los padres biolgicos de la nia, sta heredar la mitad de sus genes del hombre y la otra mitad de la mujer. Sin embargo, ste no es un buen ejemplo de herencia de clase. Las clases en este caso son Hombre y Mujer. Hay dos representantes de la clase Mujer (uno de ellas con el atributo edad menor que 16) y uno de la clase Hombre, pero no hay herencia de clase. La nica posibilidad de que en este ejemplo hubiera herencia de clase pasara por considerar que las clases Hombre y Mujer comparten una clase base Persona.

Fundamentos de la programacin orientada a objetos

39

Jerarquas de clases
Objetivo del tema
Explicar las jerarquas de clases.

Explicacin previa

Las clases que derivan de clases base pueden a su vez convertirse en clases base para otras clases.

Las clases con relaciones de herencia forman jerarquas de clases


Msico Msico toca Instrumento Instrumento musical musical

Msico de Msico de cuerda cuerda

toca

Instrumento de Instrumento de cuerda cuerda

??? ???

Violinista Violinista

toca

Violn Violn

??? ???

Las clases que derivan de clases base pueden a su vez convertirse en clases base para otras clases. En la transparencia, por ejemplo, la clase MsicoDeCuerda deriva de la clase Msico, pero a su vez en una clase base para la clase derivada Violinista. Un grupo de clases con relaciones de herencia forma una estructura conocida como jerarqua de clases. Estas clases representan conceptos ms generales (generalizacin) a medida que ascendemos en la jerarqua, y ms especializados (especializacin) a medida que nos movemos hacia abajo. La profundidad de una jerarqua de clases es el nmero de niveles de herencia que hay en la jerarqua. Las jerarquas de clases ms profundas son ms difciles de usar que las jerarquas de clases poco profundas. La mayor parte de las normas de programacin recomiendan limitar la profundidad a entre cinco y siete clases. La transparencia muestra dos jerarquas de clases paralelas, una para msicos y otra para instrumentos musicales. Crear jerarquas de clases no es fcil, ya que las clases se tienen que disear como clases base desde el principio. Las jerarquas de herencia son tambin la caracterstica principal de los marcos de trabajo o frameworks, que son modelos ampliables sobre los que se crean entidades ms complejas.

Fundamentos de la programacin orientada a objetos

40

Herencia sencilla y mltiple


Objetivo del tema
Comparar la herencia sencilla y la herencia mltiple.

Herencia sencilla: derivadas de una clase base Herencia mltiple: derivadas de dos o ms clases base
Instrumento de Instrumento de cuerda cuerda Instrumento Instrumento musical musical Con teclas Con teclas

Explicacin previa

En teora, el comportamiento de una clase puede derivar de ms de un antecesor.

Violn Violn

Instrumento de Instrumento de cuerda cuerda

Violn tiene una sola clase base directa

Instrumento de cuerda tiene dos clases base directas

La herencia se denomina sencilla cuando una clase tiene una sola clase base directa. En el ejemplo de la transparencia, la clase Violn hereda de una clase, InstrumentoDeCuerda, y es un ejemplo de herencia sencilla. InstrumentoDeCuerda deriva de dos clases, pero esto no afecta a la clase Violn. La herencia sencilla tambin puede ser difcil de utilizar. Es bien conocido que la herencia es una de las herramientas ms potentes de modelado de software, pero al mismo tiempo una de las peor entendidas y empleadas. Recomendacin al profesor La herencia se denomina mltiple una clase tiene dos o ms clases base directas. En el ejemplo de la transparencia, la clase InstrumentoDeCuerda deriva directamente de dos clases, InstrumentoMusical y ConTeclas, y proporciona un ejemplo de herencia mltiple. La herencia mltiple se utiliza mal en un gran porcentaje de casos. C#, como la mayor parte de los lenguajes de programacin modernos (excluido C++), limita el uso de la herencia mltiple: est permitida la herencia de un nmero ilimitado de interfaces, pero slo se puede heredar de una no interfaz (es decir, una clase abstracto o concreta como mucho). Los trminos interfaz, clase abstracta y clase concreta se discutirn ms adelante en este mdulo. Todas las formas de herencia, pero especialmente la herencia mltiple, ofrecen muchas vistas del mismo objeto. Por ejemplo, un objeto Violn se podra usar a nivel de la clase Violn, pero tambin a nivel de la clase InstrumentoMusical.

Puede utilizar un acorden como ejemplo de herencia mltiple.

Fundamentos de la programacin orientada a objetos

41

Polimorfismo
Explicar el concepto de polimorfismo.

Objetivo del tema

Explicacin previa

El nombre del mtodo reside en la clase base Los distintos cuerpos del mtodo residen en las clases derivadas
Msico de cuerda Msico de cuerda AfinaTuInstrumento( )) AfinaTuInstrumento( Un mtodo sin Un mtodo sin cuerpo se llama cuerpo se llama operacin operacin

A veces puede ser necesario utilizar un mtodo de diferentes maneras en distintas clases hijas.

Guitarrista Guitarrista AfinaTuInstrumento( )) AfinaTuInstrumento(

Violinista Violinista AfinaTuInstrumento( )) AfinaTuInstrumento(

Polimorfismo significa literalmente muchas formas. Es el concepto segn el cual un mtodo declarado en una clase base se puede utilizar de muchas formas diferentes en las distintas clases derivadas. Supongamos que todos los msicos de una orquesta estn afinando sus instrumentos antes de un concierto. Sin polimorfismo, el director tiene que ir de msico en msico para ver qu tipo de instrumento toca y darle instrucciones sobre cmo afinarlo. Con polimorfismo, el director slo tiene que decirle a cada msico afina tu instrumento. El instrumento que toque cada msico le es indiferente; slo necesita saber que todos ellos respondern con el comportamiento solicitado y de una forma adecuada al instrumento que tocan. De esta forma el director no tiene la responsabilidad de saber cmo se afinan todos los distintos tipos de instrumentos, sino que este conocimiento se divide entre los distintos tipos de msicos: un guitarrista sabe cmo afinar una guitarra, un violinista sabe cmo afinar un violn, etc. De hecho, el director no sabe cmo afinar ninguno de los instrumentos. Esta asignacin descentralizada de responsabilidades significa tambin que se pueden aadir a la jerarqua nuevas clases derivadas (como Tambor) sin que necesariamente se modifiquen el resto de las clases (como el director). Slo hay un problema. Cmo es el cuerpo del mtodo al nivel de la clase base? Si no se sabe qu tipo de instrumento es el que toca un msico, es imposible saber cmo afinar ese instrumento. Para hacer frente a este problema, en la clase base slo se puede declarar el nombre del mtodo, pero no el cuerpo. Un nombre de mtodo que no tenga cuerpo se llama operacin. Una de las formas de denotar una operacin en UML es ponindola en cursiva, como se muestra en la transparencia.

Fundamentos de la programacin orientada a objetos

42

Clases base abstractas


Objetivo del tema
Presentar el concepto de clase abstracta.

Explicacin previa

Algunas clases existen slo para ser clases base No tiene sentido crear instancias de estas clases Estas clases son abstractas
Msico de cuerda Msico de cuerda {{ abstract }} abstract No se pueden crear instancias No se pueden crear instancias de clases abstractas de clases abstractas Se pueden crear instancias Se pueden crear instancias de clases concretas de clases concretas Guitarrista Guitarrista concrete concrete Violinista Violinista concrete concrete

Tendra sentido crear un objeto Msico de cuerda en tiempo de ejecucin?

Recomendacin al profesor

El ejemplo de la transparencia es el mismo que el empleado en la transparencia anterior y el mismo que se usar en la siguiente.

En una jerarqua de clases tpica, la operacin (el nombre de un mtodo) se declara en la clase base y el cuerpo del mtodo se escribe de diferentes maneras en las distintas clases derivadas. La clase base existe nicamente para introducir el nombre del mtodo en la jerarqua. En particular, no es necesario que la operacin de la clase base tenga cuerpo. Por ello es fundamental que la clase base no se utilice como una clase normal y, lo que es ms importante, que no sea posible crear instancias de la clase base, ya que de lo contrario se correra el riesgo de hacer una llamada a una operacin sin cuerpo. Se necesita un mecanismo que haga imposible la creacin de instancias de estas clases base: marcar la clase base como abstracta. En un diseo UML se puede marcar una clase como abstracta escribiendo su nombre en cursiva o poniendo la palabra abstract entre llaves ({ y }). Por otra parte, es posible poner la palabra concrete o class entre dobles parntesis angulares (<< y >>) para denotar en UML una clase que no es abstracta y que se puede usar para creara instancias. La transparencia ilustra esta notacin. Todos los lenguajes de programacin orientados a objetos tienen estructuras gramaticales para clases abstractas (incluso C++ puede usar constructores protegidos). A veces la creacin de una clase base abstracta es ms retrospectiva y se combinan en una nueva clase base caractersticas comunes duplicadas en las clases derivadas. Sin embargo, tambin en este caso es necesario marcar la clase como abstracta, ya que su propsito no es la creacin de instancias, sino servir nicamente de clase base.

Fundamentos de la programacin orientada a objetos

43

Interfaces
Objetivo del tema
Describir el propsito de las interfaces.

Explicacin previa

Cmo es posible garantizar que todos los msicos (sea cual sea su tipo) derivados de Msico de cuerda saben realmente cmo afinar o tocar sus instrumentos?

Las interfaces contienen slo operaciones, no implementacin


Msico Msico interface interface Nada ms que operaciones. Nada ms que operaciones. No se pueden crear instancias No se pueden crear instancias de una interfaz. de una interfaz.

Msico de cuerda Msico de cuerda {{ abstract }} abstract

Puede contener implementacin. Puede contener implementacin. No se pueden crear instancias de No se pueden crear instancias de una interfaz. una interfaz.

Violinista Violinista concrete concrete

Implementa las operaciones heredadas. Implementa las operaciones heredadas. Se pueden crear instancias de una clase Se pueden crear instancias de una clase concreta. concreta.

Recomendacin al profesor

Hay dos puntos que vale la pena discutir en la pizarra. El primero es la importancia de que haya una interfaz por encima de una clase abstracta. El segundo se refiere al hecho de que en realidad hay dos especies diferentes de clases abstractas: La primera, que es pblica, participa en la jerarqua y tiene una interfaz por encima, mientras que la segunda, que es privada, no tiene participacin lgica en la jerarqua y normalmente se utiliza slo para modificar el cdigo y evitar repeticiones.

Las clases abstractas y las interfaces se parecen en que ninguna de ellas se puede usar para crear instancias de objetos. Sin embargo, se diferencian en que una clase abstracta puede contener mtodos con cuerpo mientras que una interfaz no contiene ninguno, sino slo operaciones (nombres de mtodos). Podramos decir que una interfaz es todava ms abstracta que una clase abstracta. En UML se puede definir una interfaz poniendo la palabra interface entre dobles parntesis angulares (<< y >>). Todos los lenguajes de programacin orientados a objetos tienen estructuras gramaticales para interfaces. Las interfaces son importantes en los programas orientados a objetos y UML tiene una notacin y una terminologa especficas para ellas. Se dice que se implementa una interfaz cuando se hace una derivacin desde ella; en UML, esto se indica con una lnea discontinua llamada realizacin. Se dice que se extiende una clase cuando se hace una derivacin desde una no interfaz (una clase abstracta o una clase concreta); en UML, esto se indica con una lnea continua llamada generalizacin/especializacin. Las interfaces deben estar en lo ms alto de una jerarqua de clases. La idea es sencilla: Si se puede programar para una interfaz (es decir, si slo se usan aquellas caractersticas de un objeto que estn declaradas en su interfaz), el programa pierde totalmente la dependencia de ese objeto especfico y su clase concreta. En otras palabras, cuando se programa para una interfaz se pueden usar indistintamente muchos objetos diferentes de muchas clases distintas. En la programacin orientada a objetos, esta capacidad de hacer cambios sin que causen efectos secundarios est en el origen de la mxima Programa para una interfaz y no para un cdigo.