Sie sind auf Seite 1von 4

Qu son la herencia y el polimorfismo?

J. Valderrama Martn, R. Rivera Pastor, C. Gascn Navarro TELEFNICA INVESTIGACIN Y DESARROLLO


El desarrollo orientado a objetos se ha revelado como una de las alternativas ms prometedoras de cara a afrontar el diseo, la implementacin y el mantenimiento de sistemas complejos. Sin duda, los conceptos de herencia y polimorfismo constituyen uno de los factores que ms ha contribuido a ello. En este articulo se ofrece una introduccin a ambos conceptos. Asimismo, y a fin de valorar las ventajas e inconvenientes que se derivan de su utilizacin, se plantea un pequeo ejemplo comparativo cuya solucin se aborda, por un lado, aplicando estas ideas, y por otro, prescindiendo de ellas. El lenguaje empleado para ello es C++. Su conocimiento, si bien es deseable, no constituye un obstculo para la comprensin del ejemplo.

INTRODUCCIN El origen de muchos de los conceptos bsicos del desarrolla orientado a objetos (objeto y clase, entre otros) se remonta a finales de la dcada de los anos 60 y comienzo de los 70, con la aparicin de los lenguajes Simula 1[6] y Simula67 [4] Sin embargo, hasta hace cuatro o cinco anos, tales conceptos hablar pasado prcticamente desapercibidos para la mayor parte de la comunidad informtica. Cules han sido los motivos que han provocado que en estos ltimos anos el inters por los sistemas orientados a objetos haya experimentado un crecimiento tan espectacular, como lo demuestran los centenares de artculos y de libros publicados en relacin con este tema? Aunque para algunos se trata simplemente de una moda pasajera, las razones son, sin duda, mucho ms profundas. En nuestra opinin, deben buscarse en las crecientes demandas y expectativas depositadas en la, todava incipiente, Ingeniera de Software:

Los sistemas son cada vez mas sofisticados, no slo por su tamango, sino por su complejidad (basta con pensar en los ambiciosos proyectos de las agencias espaciales o de algunos ministerios de defensa). Con el transcurso del tiempo, aumenta de forma significativa la preocupacin por temas tales como la calidad, fiabilidad y productividad en el desarrollo de software.

No hay duda de que el desarrollo orientado a objetos se ha revelado como una de las formulas ms prometedoras a la hora de afrontar el diseo, la implementaron y el mantenimiento de sistemas complejos y a gran escala. Prueba de ello es su incursin en reas tan dispares como:

Bases de datos [9][11] Inteligencia Artificial [7] Sistemas Distribuidos [1] Simulacin [3][17][8] Interfaces de Usuario [2][14]

De acuerdo con Meyer [12], la principal aportacin de esta nueva tecnologa a la Ingeniera del Software es la posibilidad de reutilizacin de componentes software. Tal posibilidad se sustenta en una serie de mecanismos y de conceptos, entre los cuales merecen especial

atencin, por su carcter innovador, la herencia y el polimorfismo. A ellos esta dedicado el resto del articulo.

HERENCIA El concepto de herencia constituye, a nuestro juicio, la principal innovacin del desarrollo orientado a objetos. Se trata de un concepto bastante simple e intuitivo que, de una manera informal, puede definirse como: "el mecanismo que permite definir una clase de objetos tomando como base la definicin de otra clase" Una clase se define en trminos de atributos y de mtodos (u operaciones). Por tanto, otra forma de expresar la definicin anterior seria la siguiente: "herencia es el mecanismo que permite a una clase de objetos incorporar atributos y mtodos de otra clase, aadiendolos a los que ya posee". En la terminologa habitual, la clase que hereda las caractersticas de otra y la clase de partida reciben los calificativos de "subclase" y "superclase", respectivamente. De ah que, en numerosas ocasiones, la relacin de herencia aparezca tambin referenciada como "superclase/subclase". Por otro lado, tambin suele ser muy habitual hablar en trminos de "clase padre" y "clase hija", dado lo intuitivo de ambos trminos. La contribucin ms interesante del mecanismo de herencia al desarrollo de software, y ms concretamente al objetivo de reutilizacin de componentes al que anteriormente hacamos alusin, es la flexibilidad que proporciona para capturar y aprovechar al mximo las caractersticas comunes de diferentes clases de objetos. Dicha flexibilidad se manifiesta, fundamentalmente, en dos sentidos:

Por un lado, permite recoger los aspectos comunes de dos o ms clases de objetos con el mximo nivel de detalle (a nivel de atributo y de mtodo). Por otro, ofrece la posibilidad de establecer tantos niveles de abstraccin (o de especializacin, segn se mire) como sean necesarios para reflejar fielmente nuestro modelo de la realidad. Surge, de este modo, el concepto de jerarqua de clases

Algunos lenguajes de programacin basados en el paradigma de objeto, Eiffel y C++ (Versin 2) entre otros, introducen un grado de flexibilidad adicional en el mecanismo de herencia al permitir que una clase de objetos herede atributos y mtodos de mas de una clase. Esta modalidad de herencia se conoce con el nombre de herencia mltiple y, en lugar de una jerarqua, da lugar a una organizacin de clases con forma de grafo dirigido acclico.

La importancia del concepto de herencia es tal que, para algunos autores [15][1 6], la presencia o no de mecanismos que implementen de forma natural este concepto es lo que diferencia a un lenguaje de programacin orientado a objetos de otro que no lo es. Segn esta tesis, lenguajes como Ada quedaran excluidos de tal apelativo, en contra de lo que podra deducirse a partir de las numerosas publicaciones en las que se defienden sus especiales aptitudes para esta nueva modalidad de desarrollo de software [5] [13] [10]. La ausencia del mecanismo de herencia en ciertos lenguajes de programacin modernos, como Ada, puede paliarse hasta cierto punto haciendo uso de los mecanismos alternativos que este tipo de lenguajes incorporan (por ejemplo, los genricos). No obstante, la flexibilidad que proporciona el mecanismo de herencia para reutilizar unas clases de objetos en la definicin de otras, difcilmente pueden alcanzarse mediante tales mecanismos alternativos.

POLIMORFISMO Otro concepto interesante, con Importantes aportaciones en reas tales como la flexibilidad o la legibilidad del software, es el de polimorfismo. Tras este termino, un tanto oscuro, subyace una idea bastante simple. En su ms amplia expresin, el polimorfismo puede definirse como:

"el mecanismo que permite definir e Invocar funciones idnticas en denominacin e interfaz, pero con implementaron diferente".
Esta definicin introduce un aspecto muy importante del polimorfismo: la asociacin, o vinculo, entre cada llamada a una de estas funciones polimorfismo y la implementacin concreta finalmente invocada. Cuando este vinculo puede establecerse en tiempo de compilacin, se suele hablar de vinculacin estatica (static binding). Por contra, cuando la implementacin a emplear, puede determinarse en tiempo de ejecucin, el termino empleado es el de vinculacin dinmica (dynamic binding). En C++, por ejemplo, la vinculacin dinmica de las llamadas a funciones polimrficas (en C++ reciben el calificativo de funciones virtuales) se consigue en base a la posibilidad que ofrece este lenguaje de utilizar un puntero a objetos de una clase como puntero a objetos de cualquiera de las clases descendientes de la anterior. As, cuando la llamada a una funcin virtual, definida en una clase y en una o varias de sus descendientes, se realiza sobre un objeto que viene referenciado mediante un puntero a la clase padre, el compilador es incapaz de determinar que implementacin debe asociar a la llamada, ya que desconoce cual ser la clase del objeto en el momento de su ejecucin. Dicha determinacin debe quedar aplazada, por tanto, hasta ese instante. Como se puede observar, el concepto de polimorfismo en C++, y en general en casi todos los lenguajes de programacin basados en el paradigma de objeto, esta estrechamente ligado al concepto de herencia, dado que las funciones polimrficas slo pueden definirse entre clases que guardan entre s una relacin de parentesco (clases con un antecesor comn).

Aunque el concepto de polimorfismo es una de las principales innovaciones del desarrollo orientado a objetos, posee antecedentes histricos en otros mecanismos ms sencillos, como son la conversin forzada (casting) y la sobrecarga de identificadores, ideados con el fin de introducir un cierto grado de flexibilidad en el manejo de tipos de datos heterogneos. En el siguiente apartado se desarrolla un pequeo ejemplo de aplicacin de ambos conceptos, en el que quedan claramente de manifiesto las ventajas potenciales de una correcta utilizacin de los mismos. Para su implementacin se ha elegido el lenguaje C ++, fundamentalmente por dos razones:

La amplia difusin que esta adquiriendo este lenguaje en los ambientes de desarrollo. La enorme similitud de su sintaxis con la del lenguaje C, del cual deriva

Das könnte Ihnen auch gefallen