la programación orientada a objetos

35
La Programación Orientada a Objetos (POO u OOPsegún sus siglas en inglés) es un paradigma de programación que usa objetos y sus interacciones para diseñar aplicaciones y programas de computadora. Est basado en !arias técnicas" incluyendo #erencia" modularidad" polimor$ismo" y encapsulamiento %u uso se populari&ó a principios de la década de ' . *ctualmente son muc#os los lenguajes de programación que soportan la orientación a objetos. (4) El término de Programación Orientada a Objetos indica más una forma de dise una metodología de desarrollo desoftware ue un lenguaje de !rogramación" y en realidad se !uede a!licar el #iseño Orientado a Objetos (Eninglés abre$i OO#" Object Oriented #esign)" a cualuier ti!o de lenguaje de !rogramación% El desarrollo de la OOP em!ie&a a destacar durante la década de lo ' tomand cuenta la !rogramación estructurada" a la ue engloba y dotando al !rograma de nue$os elementos !ara el análisis y desarrollo de software% (1) La programación Orientada a objetos (POO) es una forma especial de programar, más cercana a como expresaríamos las cosas en la vida real ue otros tipos de programación! "on la POO tenemos ue aprender a pensar las cosas de una manera distinta, para escribir nuestros programas en t#rminos de objetos, propiedades, m#todos $ otras cosas ue veremos rápidamente para aclarar conceptos $ dar una peue%a base ue permita soltarnos un poco con este tipo de programación! Cómo se piensa en objetos Pensar en t#rminos de objetos es mu$ parecido a cómo lo &aríamos en la vida real! Por ejemplo vamos a pensar en un coc&e para tratar de modeli'arlo en un esuema de POO! iríamos ue el coc&e es el elemento principal ue tiene una serie d características, como podrían ser el color, el modelo o la marca! demás tiene una serie de funcionalidades asociadas, como pueden ser ponerse en marc&a, parar o aparcar! Pues en un esuema POO el coc&e sería el objeto, las propiedades serían l características como el color o el modelo $ los m#todos serían las funcionalidades asociadas como ponerse en marc&a o parar!( 2) La programación orientada a objetos, intenta simular el mundo real a traves significado de objetos ue contiene caracteristicas $ funciones! Los lenguajes orientados a objetos se clasifican como lenguajes de uinta generacion!

Upload: ramces-duran

Post on 05-Nov-2015

4 views

Category:

Documents


0 download

DESCRIPTION

programacion avanzada

TRANSCRIPT

La Programacin Orientada a Objetos (POO uOOPsegn sussiglaseningls) es unparadigma de programacinque usaobjetosy sus interacciones para disear aplicaciones y programas de computadora. Est basado en varias tcnicas, incluyendo herencia, modularidad, polimorfismo, y encapsulamiento. Su uso se populariz a principios de la dcada de 1990. Actualmente son muchos los lenguajes de programacin que soportan la orientacin a objetos.(4)El trmino deProgramacin Orientada a Objetosindica ms una forma dediseoy unametodologadedesarrollodesoftwareque unlenguaje de programacin, ya que en realidad se puede aplicar elDiseoOrientado a Objetos (Eninglsabreviado OOD, Object Oriented Design), a cualquier tipo delenguajedeprogramacin.Eldesarrollode la OOP empieza a destacar durante la dcada de lo 80 tomando en cuenta laprogramacinestructurada, a la que engloba y dotando al programador de nuevos elementos para elanlisisy desarrollo desoftware.(1)La programacin Orientada a objetos (POO) es una forma especial de programar, ms cercana a como expresaramos las cosas en la vida real que otros tipos de programacin.Con la POO tenemos que aprender a pensar las cosas de una manera distinta, para escribir nuestros programas en trminos de objetos, propiedades, mtodos y otras cosas que veremos rpidamente para aclarar conceptos y dar una pequea base que permita soltarnos un poco con este tipo de programacin.Cmo se piensa en objetosPensar en trminos de objetos es muy parecido a cmo lo haramos en la vida real. Por ejemplo vamos a pensar en un coche para tratar de modelizarlo en un esquema de POO. Diramos que el coche es el elemento principal que tiene una serie de caractersticas, como podran ser el color, el modelo o la marca. Adems tiene una serie de funcionalidades asociadas, como pueden ser ponerse en marcha, parar o aparcar.Pues en un esquema POO el coche sera el objeto, las propiedades seran las caractersticas como el color o el modelo y los mtodos seran las funcionalidades asociadas como ponerse en marcha o parar.(2)La programacin orientada a objetos, intenta simular el mundo real a traves del significado de objetos que contiene caracteristicas y funciones. Los lenguajes orientados a objetos se clasifican como lenguajes de quinta generacion.Como su mismo nombre indica, la programacin orientada a objetos se basa en la idea de un objeto, que es una combinacion de variables locales y procedimientos llamados metodos que juntos conforman una entidad de programacin.(3)La POO es un paradigma de la programacin de computadores; esto hace referencia al conjunto de teoras, estndares, modelos y mtodos que permiten organizar el conocimiento, proporcionando un medio bien definido para visualizar el dominio del problema e implementar en un lenguaje de programacin la solucin a ese problema.La POO se basa en el modelo objeto, donde el elemento principal es le objeto, el cual es una unidad que contiene todas sus caractersticas y comportamientos en s misma, lo cual lo hace como un todo independiente, pero que se interrelaciona con objetos de su misma clase o de otras clase, como sucede en el mundo real.(5)Programacin orientada a objetosEste artculo o seccin necesitareferenciasque aparezcan en unapublicacin acreditada, como revistas especializadas, monografas, prensa diaria o pginas de Internetfidedignas. Este aviso fue puesto el 14 de febrero de 2015.Puedesaadirlaso avisaral autor principal del artculoen su pgina de discusin pegando:{{subst:Aviso referencias|Programacin orientada a objetos}} ~~~~

Laprogramacin orientada a objetosoPOO(OOPsegn sus siglas en ingls) es unparadigma de programacinque usaobjetosen sus interacciones, para disear aplicaciones y programasinformticos. Est basado en varias tcnicas, incluyendoherencia,cohesin,abstraccin,polimorfismo,acoplamientoyencapsulamiento. Su uso se populariz a principios de la dcada de los aos 1990. En la actualidad, existe una gran variedad de lenguajes de programacin que soportan la orientacin a objeto.ndice[ocultar] 1Introduccin 2Origen 3Conceptos fundamentales 4Caractersticas de la POO 5Resumen 6Algunos lenguajes orientados a objetos 7Vase tambin 8Notas y referencias 9Enlaces externosIntroduccin[editar]Los objetos son entidades que tienen un determinadoestado,comportamiento (mtodo)eidentidad: Elestadoest compuesto de datos o informaciones; sern uno o varios atributos a los que se habrn asignado unos valores concretos (datos). Elcomportamientoest definido por losmtodoso mensajes a los que sabe responder dicho objeto, es decir, qu operaciones se pueden realizar con l. Laidentidades una propiedad de un objeto que lo diferencia del resto; dicho con otras palabras, es su identificador (concepto anlogo al de identificador de unavariableo unaconstante).Un objeto contiene toda la informacin que permite definirlo e identificarlo frente a otros objetos pertenecientes a otras clases e incluso frente a objetos de una misma clase, al poder tener valores bien diferenciados en sus atributos. A su vez, los objetos disponen de mecanismos de interaccin llamadosmtodos, que favorecen la comunicacin entre ellos. Esta comunicacin favorece a su vez el cambio de estado en los propios objetos. Esta caracterstica lleva a tratarlos como unidades indivisibles, en las que no se separa el estado y el comportamiento.Losmtodos (comportamiento)yatributos (estado)estn estrechamente relacionados por la propiedad de conjunto. Esta propiedad destaca que una clase requiere de mtodos para poder tratar los atributos con los que cuenta. Elprogramadordebe pensar indistintamente en ambos conceptos, sin separar ni darle mayor importancia a alguno de ellos. Hacerlo podra producir el hbito errneo de crear clases contenedoras de informacin por un lado y clases con mtodos que manejen a las primeras por el otro. De esta manera se estara realizando unaprogramacin estructuradacamufladaen un lenguaje de programacin orientado a objetos.La POO difiere de laprogramacin estructuradatradicional, en la que los datos y los procedimientos estn separados y sin relacin, ya que lo nico que se busca es el procesamiento de unos datos de entrada para obtener otros de salida. La programacin estructurada anima al programador a pensar sobre todo en trminos de procedimientos o funciones, y en segundo lugar en las estructuras de datos que esos procedimientos manejan. En la programacin estructurada solo se escriben funciones que procesan datos. Los programadores que emplean programacin orientada a objetos, en cambio, primero definen objetos para luego enviarles mensajes solicitndoles que realicen sus mtodos por s mismos.Origen[editar]Los conceptos de la programacin orientada a objetos tienen origen enSimula 67, un lenguaje diseado para hacer simulaciones, creado porOle-Johan DahlyKristen Nygaard, del Centro de Cmputo Noruego enOslo. En este centro se trabajaba en simulaciones de naves, que fueron confundidas por la explosin combinatoria de cmo las diversas cualidades de diferentes naves podan afectar unas a las otras. La idea surgi al agrupar los diversos tipos de naves en diversas clases de objetos, siendo responsable cada clase de objetos de definir suspropiosdatos y comportamientos. Fueron refinados ms tarde enSmalltalk, desarrollado en Simula enXerox PARC(cuya primera versin fue escrita sobreBasic) pero diseado para ser un sistema completamente dinmico en el cual los objetos se podran crear y modificar "sobre la marcha" (en tiempo de ejecucin) en lugar de tener un sistema basado en programas estticos.La programacin orientada a objetos se fue convirtiendo en el estilo de programacin dominante a mediados de los aos ochenta, en gran parte debido a la influencia deC++, una extensin dellenguaje de programacin C. Su dominacin fue consolidada gracias al auge de lasInterfaces grficas de usuario, para las cuales la programacin orientada a objetos est particularmente bien adaptada. En este caso, se habla tambin deprogramacin dirigida por eventos.Las caractersticas de orientacin a objetos fueron agregadas a muchos lenguajes existentes durante ese tiempo, incluyendoAda,BASIC,LispmsPascal, entre otros. La adicin de estas caractersticas a los lenguajes que no fueron diseados inicialmente para ellas condujo a menudo a problemas de compatibilidad y en la capacidad de mantenimiento del cdigo. Los lenguajes orientados a objetos "puros", por su parte, carecan de las caractersticas de las cuales muchos programadores haban venido a depender. Para saltar este obstculo, se hicieron muchas tentativas para crear nuevos lenguajes basados en mtodos orientados a objetos, pero permitiendo algunas caractersticas imperativas de maneras "seguras". ElEiffelde Bertrand Meyer fue un temprano y moderadamente acertado lenguaje con esos objetivos, pero ahora ha sido esencialmente reemplazado porJava, en gran parte debido a la aparicin deInternety a la implementacin de la mquina virtual de Java en la mayora denavegadores.PHPen su versin 5 se ha modificado; soporta una orientacin completa a objetos, cumpliendo todas las caractersticas propias de la orientacin a objetos.Conceptos fundamentales[editar]La programacin orientada a objetos es una forma de programar que trata de encontrar una solucin a estos problemas. Introduce nuevos conceptos, que superan y amplan conceptos antiguos ya conocidos. Entre ellos destacan los siguientes:ClaseDefiniciones de las propiedades y comportamiento de un tipo de objeto concreto. La instanciacin es la lectura de estas definiciones y la creacin de un objeto a partir de ella.Herencia(Por ejemplo, herencia de la clase C a la clase D) es la facilidad mediante la cual la clase D hereda en ella cada uno de los atributos y operaciones de C, como si esos atributos y operaciones hubiesen sido definidos por la misma D. Por lo tanto, puede usar los mismos mtodos y variables pblicas declaradas en C. Los componentes registrados como "privados" (private) tambin se heredan, pero como no pertenecen a la clase, se mantienen escondidos al programador y slo pueden ser accedidos a travs de otros mtodos pblicos. Esto es as para mantener hegemnico el ideal de POO.ObjetoInstancia de una clase. Entidad provista de un conjunto de propiedades o atributos (datos) y de comportamiento o funcionalidad (mtodos), los mismos que consecuentemente reaccionan a eventos. Se corresponden con los objetos reales del mundo que nos rodea, o con objetos internos del sistema (del programa). Es una instancia a una clase.MtodoAlgoritmo asociado a un objeto (o a una clase de objetos), cuya ejecucin se desencadena tras la recepcin de un "mensaje". Desde el punto de vista del comportamiento, es lo que el objeto puede hacer. Un mtodo puede producir un cambio en las propiedades del objeto, o la generacin de un "evento" con un nuevo mensaje para otro objeto del sistema.EventoEs un suceso en el sistema (tal como una interaccin del usuario con la mquina, o un mensaje enviado por un objeto). El sistema maneja el evento enviando el mensaje adecuado al objeto pertinente. Tambin se puede definir como evento la reaccin que puede desencadenar un objeto; es decir, la accin que genera.AtributosCaractersticas que tiene la clase.MensajeUna comunicacin dirigida a un objeto, que le ordena que ejecute uno de sus mtodos con ciertos parmetros asociados al evento que lo gener.Propiedad o atributoContenedor de un tipo de datos asociados a un objeto (o a una clase de objetos), que hace los datos visibles desde fuera del objeto y esto se define como sus caractersticas predeterminadas, y cuyo valor puede ser alterado por la ejecucin de algn mtodo.Estado internoEs una variable que se declara privada, que puede ser nicamente accedida y alterada por un mtodo del objeto, y que se utiliza para indicar distintas situaciones posibles para el objeto (o clase de objetos). No es visible al programador que maneja una instancia de la clase.Componentes de un objetoAtributos, identidad, relaciones y mtodos.Identificacin de un objetoUn objeto se representa por medio de una tabla o entidad que est compuesta por sus atributos y funciones correspondientes.En comparacin con un lenguaje imperativo, una "variable" no es ms que un contenedor interno del atributo del objeto o de un estado interno, as como la "funcin" es un procedimiento interno del mtodo del objeto.Caractersticas de la POO[editar]Existe un acuerdo acerca de qu caractersticas contempla la "orientacin a objetos". Las caractersticas siguientes son las ms importantes:AbstraccinDenota las caractersticas esenciales de un objeto, donde se capturan sus comportamientos. Cada objeto en el sistema sirve como modelo de un "agente" abstracto que puede realizar trabajo, informar y cambiar su estado, y "comunicarse" con otros objetos en el sistema sin revelarcmose implementan estas caractersticas. Los procesos, las funciones o los mtodos pueden tambin ser abstrados, y, cuando lo estn, una variedad de tcnicas son requeridas para ampliar una abstraccin. El proceso de abstraccin permite seleccionar las caractersticas relevantes dentro de un conjunto e identificar comportamientos comunes para definir nuevos tipos de entidades en el mundo real. La abstraccin es clave en el proceso de anlisis y diseo orientado a objetos, ya que mediante ella podemos llegar a armar un conjunto de clases que permitan modelar la realidad o el problema que se quiere atacar.EncapsulamientoSignifica reunir todos los elementos que pueden considerarse pertenecientes a una misma entidad, al mismo nivel de abstraccin. Esto permite aumentar lacohesinde los componentes del sistema. Algunos autores confunden este concepto con el principio de ocultacin, principalmente porque se suelen emplear conjuntamente.ModularidadSe denomina modularidad a la propiedad que permite subdividir una aplicacin en partes ms pequeas (llamadas mdulos), cada una de las cuales debe ser tan independiente como sea posible de la aplicacin en s y de las restantes partes. Estos mdulos se pueden compilar por separado, pero tienen conexiones con otros mdulos. Al igual que la encapsulacin, los lenguajes soportan la modularidad de diversas formas.Principio de ocultacinCada objeto est aislado del exterior, es un mdulo natural, y cada tipo de objeto expone unainterfaza otros objetos que especifica cmo pueden interactuar con los objetos de la clase. El aislamiento protege a las propiedades de un objeto contra su modificacin por quien no tenga derecho a acceder a ellas; solamente los propios mtodos internos del objeto pueden acceder a su estado. Esto asegura que otros objetos no puedan cambiar el estado interno de un objeto de manera inesperada, eliminando efectos secundarios e interacciones inesperadas. Algunos lenguajes relajan esto, permitiendo un acceso directo a los datos internos del objeto de una manera controlada y limitando el grado de abstraccin. La aplicacin entera se reduce a un agregado orompecabezasde objetos.PolimorfismoComportamientos diferentes, asociados a objetos distintos, pueden compartir el mismo nombre; al llamarlos por ese nombre se utilizar el comportamiento correspondiente al objeto que se est usando. O, dicho de otro modo, las referencias y las colecciones de objetos pueden contener objetos de diferentes tipos, y la invocacin de un comportamiento en una referencia producir el comportamiento correcto para el tipo real del objeto referenciado. Cuando esto ocurre en "tiempo de ejecucin", esta ltima caracterstica se llamaasignacin tardaoasignacin dinmica. Algunos lenguajes proporcionan medios ms estticos (en "tiempo de compilacin") de polimorfismo, tales como las plantillas y lasobrecarga de operadoresde C++.HerenciaLas clases no se encuentran aisladas, sino que se relacionan entre s, formando una jerarqua de clasificacin. Los objetos heredan las propiedades y el comportamiento de todas las clases a las que pertenecen. La herencia organiza y facilita el polimorfismo y el encapsulamiento, permitiendo a los objetos ser definidos y creados como tipos especializados de objetos preexistentes. Estos pueden compartir (y extender) su comportamiento sin tener que volver a implementarlo. Esto suele hacerse habitualmente agrupando los objetos enclasesy estas enrbolesoenrejadosque reflejan un comportamiento comn. Cuando un objeto hereda de ms de una clase se dice que hayherencia mltiple; siendo de alta complejidad tcnica por lo cual suele recurrirse a la herencia virtual para evitar la duplicacin de datos.Recoleccin de basuraLa recoleccin de basura ogarbage collectiones la tcnica por la cual el entorno de objetos se encarga de destruir automticamente, y por tanto desvincular la memoria asociada, los objetos que hayan quedado sin ninguna referencia a ellos. Esto significa que el programador no debe preocuparse por la asignacin o liberacin de memoria, ya que el entorno la asignar al crear un nuevo objeto y la liberar cuando nadie lo est usando. En la mayora de los lenguajes hbridos que se extendieron para soportar el Paradigma de Programacin Orientada a Objetos como C++ uObject Pascal, esta caracterstica no existe y la memoria debe desasignarse expresamente.

Polimorfismo en Programacin Orientada a Objetos PorMiguel Angel lvarez 20 de mayo de 2014 23 Comentarios Desarrollo,ProgramacinQu es el polimorfismo en la Programacin Orientada a Objetos, el motivo de su existencia y cmo implementar polimorfismo en clases y objetos.El concepto de polimorfismo es en realidad algo muy bsico. Realmente, cuando estamos aprendiendo Programacin Orientada a Objetos (tambin conocida por sus siglas POO / OOP) muchos estudiantes nos hacemos un embolado tremendo al tratar de entender el concepto, pero en su base es algo extremadamente sencillo.Trataremos de explicarlo en este artculo con palabras sencillas, pero para los valientes, aqu va una primera definicin que no es ma y que carece de la prometida sencillez. Pero no te preocupes, pues la entiendas o no, luego lo explicar todo de manera ms llana.

Definicin:El polimorfismo es una relajacin del sistema de tipos, de tal manera que una referencia a una clase (atributo, parmetro o declaracin local o elemento de un vector) acepta direcciones de objetos de dicha clase y de sus clases derivadas (hijas, nietas, ).Nota:Esta es la definicin acadmica que nos ofrece el profesor de la UPM Luis Fernndez, del que fui alumno en la universidad y en EscuelaIT.Herencia y las clasificaciones en Programacin Orientada a ObjetosPara poder entender este concepto de OOP necesitas entender otras cosas previas, como es el caso de la herencia. Esto lo hemos explicado en un artculo anterior en DesarrolloWeb.com:Herencia en la Programacin Orientada a Objetos.Veremos que el polimorfismo y la herencia son dos conceptos estrechamente ligados. Conseguimos implementar polimorfismo en jerarquas de clasificacin que se dan a travs de la herencia. Por ejemplo, tenemos una clase vehculo y de ella dependen varias clases hijas como coche, moto, autobs, etc.

Pero antes de entender todo esto, queremos ir un poco ms hacia atrs, entendiendo lo que es un sistema de tipos.Por qu el sistema de tipos es importante en PolimorfismoMuchos de los lectores que asumo se introducen en el concepto de polimorfismo a travs de este artculo han aprendido a programar en lenguajesdbilmente tipados, como es el caso de PHP y Javascript. Por ello es conveniente entender cmo es un lenguajefuertemente tipado, como es el caso de Java o C.En estos lenguajes, cuando defino una variable, siempre tengo que decir el tipo de datos que va a contener esta variable. Por ejemplo:int miNumero;As le indicamos que la variable declarada "miNumero" va a contener siempre un entero. Podrs asignarle diversos valores, pero siempre deben de ser nmeros enteros. De lo contrario el compilador te lanzar un mensaje de error y no te permitir compilar el programa que has realizado.Esto incluso pasa con los objetos. Por ejemplo, si en Java defino la clase "Largometraje" (una cinta que se puede exhibir en la televisin o el cine), cuando creo objetos de la clase "Largometraje" debo declarar variables en las que indique el tipo de objeto que va a contener.Largometraje miLargo = new Largometraje("Lo que el viento se llev");Esa variable "miLargo", por declaracin tendr una referencia a un objeto de la clase "Largometraje". Pues bien, durante toda su vida, deber tener siempre una referencia a cualquier objeto de la misma clase. O sea, maana no podremos guardar un entero en la variable, ni una cadena u otro objeto de otra clase.Volviendo al ejemplo de los vehculos, si defino una variable que apunta a un objeto de clase "Coche", durante toda la vida de esa variable tendr que contener un objeto de la clase Coche, no pudiendo ms adelante apuntar a un objeto de la clase Moto o de la clase Bus. Esta rigidez, como decimos, no existe en los lenguajes dbilmente tipados como es el caso de Javascript o PHP, sin embargo es una caracterstica habitual de lenguajes como Java, que son fuertemente tipados.Coche miCoche = new Coche("Ford Focus 2.0");//la variable miCoche apunta a un objeto de la clase coche//si lo deseo, maana podr apuntar a otro objeto diferente, pero siempre tendr que ser de la clase CochemiCoche = new Coche("Renault Megane 1.6");Lo que nunca podr hacer es guardar en esa variable, declarada como tipo Coche, otra cosa que no sea un objeto de la clase Coche.//si miCoche fue declarada como tipo Coche, no puedo guardar un objeto de la clase MotomiCoche = new Moto("Yamaha YBR");//la lnea anterior nos dara un error en tiempo de compilacinFjate que en este punto no te estoy hablando todava de polimorfismo, sino de algo de laprogramacin en general como es el sistema de tipos. Sin embargo, tienes que amoldar la cabeza a estarestriccin de lenguajes fuertemente tipadospara que luego puedas entender por qu el polimorfismo es importante y clave en la programacin orientada a objetos. Y ojo, insisto que esto es algo relacionado con lenguajes fuertemente tipados (tambin llamados de tipado esttico), en PHP no habra problema en cambiar el tipo de una variable, asignando cualquier otra cosa, dado que no se declaran los tipos al crear las variables.Entendida esa premisa, pensemos en el concepto de funcin y su uso en lenguajes de tipado esttico.Nota:A veces, a los lenguajes fuertemente tipados se les llama de "tipado esttico" y a los dbilmente tipados se les llama "tipado dinmico". Si quieres saber ms sobre lenguajes tipados y no tipados, te recomiendover el #programadorIO tipados Vs no tipados.Cuando en un lenguaje fuertemente tipado declaramos una funcin, siempre tenemos que informar el tipo de los parmetros que va a recibir. Por ejemplo, la funcin "sumaDosNumeros()" recibir dos parmetros, que podrn ser de tipo entero.function sumaDosNumeros(int num1, int num2)A esta funcin, tal como est declarada, no le podremos pasar como parmetros otra cosa que no sean variables -o literales- con valores de nmero entero. En caso de pasar otros datos con otros tipos, el compilador te alertar. Osea, si intentas invocar sumaDosNumeros("algo", "otro"), el compilador no te dejar compilar el programa porque no ha encontrado los tipos esperados en los parmetros de la funcin.Esto mismo de los parmetros en las funciones te ocurre tambin con los atributos de las clases, cuyos tipos tambin se declaran, con los datos que se insertan en unarray, etc. Como ves, en estos lenguajes como Java el tipado se lleva a todas partes.Polimorfismo en objetosAhora prate a pensar en clases y objetos. Qudate con esto:Tal como funcionan los lenguajes fuertemente tipados, una variable siempre deber apuntar a un objeto de la clase que se indic en el momento de su declaracin. Una funcin cuyo parmetro se haya declarado de una clase, slo te aceptar recibir objetos de esa clase. Un array que se ha declarado que es de elementos de una clase determinada, solo aceptar que rellenemos sus casillas con objetos de esa clase declarada.Vehiculo[] misVehiculos = new Vehiculo[3];Esa variable misVehiculos es un array y en ella he declarado que el contenido de las casillas sern objetos de la clase "Vehiculo". Como se ha explicado, en lenguajes fuertemente tipados slo podra contener objetos de la clase Vehiculo. Pues bien, polimorfismo es el mecanismo por el cual podemos"relajar el sistema de tipos", de modo que nos acepte tambin objetos de las clases hijas o derivadas.Por tanto, la "relajacin" del sistema de tipos no es total, sino que tiene que ver con las clasificaciones de herencia que tengas en tus sistemas de clases. Si defines un array con casillas de una determinada clase, el compilador tambin te aceptar que metas en esas casillas objetos de unaclase hijade la que fue declarada. Si declaras que una funcin recibe como parmetros objetos de una determinada clase, el compilador tambin te aceptar que le enves en la invocacin objetos de una clase derivada de aquella que fue declarada.En concreto, en nuestro array de vehculos, gracias al polimorfismo podrs contener en los elementos del array no solo vehculos genricos, sino tambin todos los objetos de clases hijas o derivadas de la clase "Vehiculo", osea objetos de la clase "Coche", "Moto", "Bus" o cualquier hija que se haya definido.Para qu nos sirve en la prctica el polimorfismoVolvamos a la clase "Largometraje" y ahora pensemos en la clase "Cine". En un cine se reproducen largometrajes. Puedes, no obstante, tener varios tipos de largometrajes, como pelculas o documentales, etc. Quizs las pelculas y documentales tienen diferentes caractersticas, distintos horarios de audiencia, distintos precios para los espectadores y por ello has decidido que tu clase "Largometraje" tenga clases hijas o derivadas como "Pelcula" y "Documental".Imagina que en tu clase "Cine" creas un mtodo que se llama "reproducir()". Este mtodo podr recibir como parmetro aquello que quieres emitir en una sala de cine y podrn llegarte a veces objetos de la clase "Pelcula" y otras veces objetos de la clase "Documental". Si has entendido el sistema de tipos, y sin entrar todava en polimorfismo, debido a que los mtodos declaran los tipos de los parmetros que recibes, tendrs que hacer algo como esto:reproducir(Pelicula peliculaParaReproducir)Pero si luego tienes que reproducir documentales, tendrs que declarar:reproducir(Documental documentaParaReproducir)Probablemente el cdigo de ambos mtodos sea exactamente el mismo. Poner la pelcula en el proyector, darle alplay, crear un registro con el nmero de entradas vendidas, parar la cinta cuando llega al final, etc. Realmente es necesario hacer dos mtodos? De acuerdo, igual no te supone tanto problema, pero si maana te mandan otro tipo de cinta a reproducir, como la grabacin de la final del mundial de ftbol en 3D? Tendrs que crear un nuevo mtodo reproducir() sobre la clase "Cine" que te acepte ese tipo de emisin? es posible ahorrarnos todo ese mantenimiento?Aqu es donde el polimorfismo nos ayuda. Podras crear perfectamente un mtodo "reproducir()" que recibe un largometraje y donde podrs recibir todo tipo de elementos, pelculas, documentales y cualquier otra cosa similar que sea creada en el futuro.Entonces lo que te permiten hacer los lenguajes es declarar el mtodo "reproducir()" indicando que el parmetro que vas a recibir es un objeto de la clase padre "Largometraje", pero donde realmente el lenguaje y compilador te aceptan cualquier objeto de la clase hija o derivada, "Pelcula", "Documental", etc.reproducir(Largometraje elementoParaReproducir)Podremos crear pelculas y reproducirlas, tambin crear documentales para luego reproducir y lo bonito de la historia es que todos estos objetos son aceptados por el mtodo "reproducir()", gracias a la relajacin del sistema de tipos. Incluso, si maana quieres reproducir otro tipo de cinta, no tendrs que tocar la clase "Cine" y el mtodo "reproducir()". Siempre que aquello que quieras reproducir sea de la clase "Largometraje" o una clase hija, el mtodo te lo aceptar.Pongamos otro ejemplopor si acaso no ha quedado claro con lo visto hasta el momento, volviendo de nuevo a la clase Vehiculo. Adems nos centramos en la utilidad del polimorfismo y sus posibilidades para reducir el mantenimiento de los programas informticos, que es lo que realmente me gustara que se entienda.Tenemos la clase Parking. Dentro de sta tenemos un mtodo estacionar(). Puede que en un parking tenga que estacionar coches, motos o autobuses. Sin polimorfismo tendra que crear un mtodo que permitiese estacionar objetos de la clase "Coche", otro mtodo que acepte objetos de la clase "Moto" para estacionarlos, etc. Pero todos estaremos de acuerdo que estacionar un coche, una moto o un bus es bastante similar: "entrar en el parking, recoger el ticket de entrara, buscar una plaza, situar el vehculo dentro de esa plaza...".Lo ideal sera que nuestro mtodo me permita permita recibir todo tipo de vehculos para estacionarlos, primero por reutilizacin del cdigo, ya que es muy parecido estacionar uno u otro vehculo, pero adems porque as si maana el mercado trae otro tipo de vehculos, como una van, todoterreno hibrido, o una nave espacial, mi software sea capaz de aceptarlos sin tener que modificar la clase Parking.Gracias al polimorfismo, cuando declaro la funcin estacionar() puedo decir que recibe como parmetro un objeto de la clase "Vehiculo" y el compilador me aceptar no solamente vehculos genricos, sino todos aquellos objetos que hayamos creado que hereden de la clase Vehculo, osea, coches, motos, buses, etc. Esa relajacin del sistema de tipos para aceptar una gama de objetos diferente es lo que llamamos polimorfismo.

En fin, esto es lo que significa polimorfismo. A partir de aqu puede haber otra serie de consideraciones y recomendaciones, as como caractersticas implementadas en otros lenguajes, pero explicar todo eso no es el objetivo de este artculo. Esperamos que con lo que has aprendido puedas orientar mejor tus estudios de Programacin Orientada a Objetos. Si quieres ms informacin sobre el tema lee el artculoQu es Programacin Orientada a Objetos, que seguro te ser de gran utilidad.Polimorfismo (informtica)Existendesacuerdos sobre la exactitud de la informacinen este artculo o seccin.Enla pgina de discusinpuedes consultar el debate al respecto.

Enprogramacin orientada a objetos, elpolimorfismose refiere a la propiedad por la que es posible enviar mensajes sintcticamente iguales aobjetosdetiposdistintos. El nico requisito que deben cumplir los objetos que se utilizan de manera polimrfica es saber responder al mensaje que se les enva.La apariencia del cdigo puede ser muy diferente dependiendo del lenguaje que se utilice, ms all de las obvias diferencias sintcticas.Por ejemplo, en un lenguaje de programacin que cuenta con unsistema de tiposdinmico (en los que las variables pueden contener datos de cualquier tipo u objetos de cualquier clase) comoSmalltalkno se requiere que los objetos que se utilizan de modo polimrfico sean parte de una jerarqua de clases.ndice[ocultar] 1Descripcin 2Clasificacin 3Ejemplo de polimorfismo 4Polimorfismo desde una interfaz 5Diferencias entre polimorfismo y sobrecarga 6ReferenciasDescripcin[editar]En lenguajes basados en clases y con unsistema de tiposde datos fuerte (independientemente de si la verificacin se realiza en tiempo de compilacin o de ejecucin), es posible que el nico modo de poder utilizar objetos de manera polimrfica sea que compartan una raz comn, es decir, una jerarqua de clases, ya que esto proporciona la compatibilidad de tipos de datos necesaria para que sea posible utilizar una misma variable de referencia (que podr apuntar a objetos de diversas subclases de dicha jerarqua) para enviar el mismo mensaje (o un grupo de mensajes) al grupo de objetos que se tratan de manera polimrfica.No obstante, algunos lenguajes de programacin (Java, C++) permiten que dos objetos de distintas jerarquas de clases respondan a los mismos mensajes, a travs de las denominadasinterfaces(esta tcnica se conoce comocomposicin de objetos). Dos objetos que implementen la misma interfaz podrn ser tratados de forma idntica, como un mismo tipo de objeto, el tipo definido por la interfaz. As, distintos objetos podrn intercambiarse en tiempo de ejecucin siempre que sean del mismo tipo, y adems con dependencias mnimas entre ellos. Por estos motivos se considera un buen principio de diseo en programacin orientada a objetos el favorecer la composicin de objetos frente a la herencia de clases.1EnJavalas interfaces se declaran mediante la palabra claveInterface. Estas se utilizan para lograr la necesaria concordancia de tipos que hace posible el polimorfismo, tambin como un contrato que debe cumplir cualquier clase que implemente una cierta interfaz, y como una forma de documentacin para los desarrolladores. A veces, en la literatura especfica sobre Java se habla de "herencia y polimorfismo de interfaces", lo que no concuerda con los conceptos de la programacin orientada a objetos porque una clase que implementa una interfaz slo obtiene su tipo de datos y la obligacin de implementar sus mtodos, no copia comportamiento ni atributos. Esta terminologa puede llevar a confusin, puesto que en Java a menudo se utiliza la mal llamada "herencia de interfaces" para dotar a una clase de uno o varios tipos adicionales, lo que unido a la composicin, evite la necesidad de la herencia mltiple y favorezca una utilizacin ms amplia del polimorfismo.No obstante, el uso de una jerarqua de clases como paso previo, es muy habitual incluso en aquellos lenguajes en los que es posible prescindir de tal jerarqua, ya que, desde una perspectiva conceptual, se puede decir que al pertenecer los "objetos polimrficos" a subclases de una misma jerarqua, se asegura la equivalencia semntica de los mensajes que se invocarn de modo polimrfico. Por esto, en programacin orientada a objetos a veces se denomina al polimorfismo como "polimorfismo de subclase (o de subtipo)".En resumen, en la programacin orientada a objetos, la esencia del polimorfismo no atae a la clase o prototipo de la que provienen los objetos. Aun as, en los lenguajes basados en clases, es habitual (y en algunos tal vez sea el nico modo) que dichos objetos pertenezcan a subclases pertenecientes a una misma jerarqua. Entonces, el polimorfismo debe verse como una forma flexible de usar un grupo de objetos (como si fueran slo uno). Podra decirse queel polimorfismo en esencia refiere al comportamiento de los objetos, no a su pertenencia a una jerarqua de clases (o a sus tipos de datos).Lo anterior se hace an ms evidente en lenguajes de programacin orientada a objetos basados en prototipos, comoSelf, en los que las clases no existen.Adems, es importante remarcar que si un cierto grupo de objetos pueden utilizarse de manera polimrfica es porque, en ltima instancia, todos ellos saben responder a un cierto mensaje (o a varios), pero dado que esos mismos objetos generalmente contendrn otros mtodos (que otros objetos en dicho grupo no contienen), difcilmente se pueda decir lisa y llanamente que los objetos son polimrficos; lo correcto es decir que esos objetos se pueden utilizar de modo polimrfico para un cierto conjunto de mensajes.Un ejemplo. Podemos crear dos clases distintas:PezyAveque heredan de lasuperclaseAnimal. LaclaseAnimaltiene el mtodo abstractomoverquese implementa de forma distinta en cada una de las subclases(peces y aves se mueven de forma distinta). Entonces, un tercer objeto puede enviar el mensajemovera un grupo de objetosPezyAvepor medio de una variable de referencia de claseAnimal, haciendo as un uso polimrfico de dichos objetos respecto del mensajemover.El concepto de polimorfismo, desde una perspectiva ms general, se puede aplicar tanto a funciones como a tipos de datos. As nacen los conceptos defunciones polimrficasytipos polimrficos. Las primeras son aquellas funciones que pueden evaluarse o ser aplicadas a diferentes tipos de datos de forma indistinta; lostipos polimrficos, por su parte, son aquellos tipos de datos que contienen al menos un elemento cuyo tipo no est especificado.Clasificacin[editar]Se puede clasificar el polimorfismo en dos grandes clases: Polimorfismo dinmico(opolimorfismo paramtrico) es aqul en el que el cdigo no incluye ningn tipo de especificacin sobre el tipo de datos sobre el que se trabaja. As, puede ser utilizado a todo tipo de datos compatible. Polimorfismo esttico(opolimorfismoad hoc) es aqul en el que los tipos a los que se aplica el polimorfismo deben ser explcitos y declarados uno por uno antes de poder ser utilizados.El polimorfismo dinmico unido a la herencia es lo que en ocasiones se conoce comoprogramacin genrica.Tambin se clasifica en herencia por redefinicin de mtodos abstractos y por mtodo sobrecargado. El segundo hace referencia al mismo mtodo con diferentes parmetros.Otra clasificacin agrupa los polimorfismo en dos tipos:Ad-Hocque incluye a su vez sobrecarga de operadores y coercin,Universal(inclusin o controlado por la herencia, paramtrico o genericidad).Ejemplo de polimorfismo[editar]En el siguiente ejemplo hacemos uso del lenguaje C++ para ilustrar el polimorfismo. Se observa a la vez el uso de las funciones virtuales puras, como se les conoce en C++, estas funciones constituyen una interfaz ms consistente cuando se trabaja con una jerarqua de clases, puesto que hacen posible el enlace durante la ejecucin. Sin embargo como se ver, para que el polimorfismo funcione no es una condicin obligatoria que todas las funciones en la clase base sean declaradas como virtuales.

Diagrama de clasesUML, que describe grficamente la relacin entre la clase base Figura y sus posibles clases derivadas, y la entidad que utiliza esta estructura: la Aplicacin, tambin identificado como objeto Cliente.#includeusing namespace std; class Figura { private: float base; float altura; public: void captura(); virtual unsigned float perimetro()=0; virtual unsigned float area()=0;}; class Rectangulo: public Figura { public: void imprime(); unsigned float perimetro(){return 2*(base+altura);} unsigned float area(){return base*altura;}}; class Triangulo: public Figura { public: void muestra(); unsigned float perimetro(){return 2*altura+base} unsigned float area(){return (base*altura)/2;}}; void Figura::captura(){ cout base; cout