Вы находитесь на странице: 1из 21

UNIVERSIDAD CATOLICA DE SANTA MARIA

CURSO: PROGRAMACION ELECTRONICA II


TEMA: Herencia, Polimorfismo Y
Estructura dinmica de datos
DOCENTE: JUAN MEDARDO QUISPE YAUYO
ALUMNO:

LEONARDO NEZ MESSA


AREQUIPA
2015

Herencia en programacin orientada a objetos

En programacin orientada a objetos, la herencia es, despus de la


agregacin o composicin, el mecanismo ms utilizado para alcanzar
algunos de los objetivos ms preciados en el desarrollo de software
como lo son la reutilizacin y la extensibilidad. A travs de ella los
diseadores pueden crear nuevas clases partiendo de una clase o de
una jerarqua de clases preexistente (ya comprobadas y verificadas)
evitando con ello el rediseo, la modificacin y verificacin de la parte
ya implementada. La herencia facilita la creacin de objetos a partir
de otros ya existentes e implica que una subclase obtiene todo el
comportamiento (mtodos) y eventualmente los atributos (variables)
de su superclase.
Es la relacin entre una clase general y otra clase ms especfica. Por
ejemplo: Si declaramos una clase prrafo derivada de una clase texto,
todos los mtodos y variables asociadas con la clase texto, son
automticamente heredados por la subclase prrafo.
La herencia es uno de los mecanismos de los lenguajes de programacin
orientada a objetos basados en clases, por medio del cual una clase se
deriva de otra de manera que extiende su funcionalidad. La clase de
la que se hereda se suele denominar clase base, clase
padre, superclase, clase ancestro (el vocabulario que se utiliza suele
depender en gran medida del lenguaje de programacin).

Se declaran las clases mamferos, gato y perro, haciendo que gato y


perro sean unos mamferos (derivados de esta clase), y se ve como a
travs de ellos se nombra al animal pero as tambin se accede a
patas dndole el valor por defecto para esa especie.
Es importante destacar tres cosas. La primera, es que la herencia no
es un mecanismo esencial en el paradigma de programacin
orientada a objetos; en la mayora de los lenguajes orientados a
objetos basados en prototipos las clases no existen, en consecuencia
tampoco existe la herencia y el polimorfismo se logra por otros
medios. La segunda, es que el medio preferido para lograr los
objetivos de extensibilidad y reutilizacin es la agregacin o
composicin. La tercera, es que en lenguajes con un sistema de tipos
dbiles, el polimorfismo se puede lograr sin utilizar la herencia.

Por otra parte y aunque la herencia no es un concepto indispensable


en el paradigma de programacin orientada a objetos, es mucho ms
que un mecanismo de los lenguajes basados en clases, porque
implica una forma de razonar sobre cmo disear ciertas partes de un
programa. Es decir, no slo es un mecanismo que permite
implementar un diseo, sino que establece un marco conceptual que
permite razonar sobre cmo crear ese diseo.
La herencia permite que existan clases que nunca sern instanciadas
directamente. En el ejemplo anterior, una clase "perro" heredara los
atributos y mtodos de la clase "mamfero", as como tambin "gato",
"delfn" o cualquier otra subclase; pero, en ejecucin, no habr ningn
objeto "mamfero" que no pertenezca a alguna de las subclases. En
ese caso, a una clase as se la conocera como Clase Abstracta. La
ausencia de instancias especficas es su nica particularidad, para
todo lo dems es como cualquier otra clase.
En ciertos lenguajes, el diseador puede definir qu variables de
instancia y mtodos de los objetos de una clase son visibles. En C++
y java esto se consigue con las
especificaciones private, protected y public. Slo las variables y
mtodos definidos como pblicos en un objeto sern visibles por
todos los objetos. En otros lenguajes como Smalltalk, todas las
variables de instancia son privadas y todos los mtodos son pblicos.
Dependiendo del lenguaje que se utilice, el diseador tambin puede
controlar qu miembros de las superclases son visibles en las
subclases. En el caso de java y C++ los especificadores de acceso
(private, protected, public) de los miembros de la superclase afectan
tambin a la herencia:

Private:
Ningn miembro privado de la superclase es visible en la
subclase.

Protected:
Los miembros protegidos de la superclase son visibles en la
subclase, pero no visibles para el exterior.

Public:
Los miembros pblicos de la superclase siguen siendo pblicos
en la subclase.

VENTAJAS:

Ayuda a los programadores a ahorrar cdigo y tiempo, ya que la


clase padre ha sido implementada y verificada con anterioridad,
restando solo referenciar desde la clase derivada a la clase base
(que suele ser extends, inherits, subclass u otras palabras clave
similares, dependiendo del lenguaje).

Los objetos pueden ser construidos a partir de otros similares.


Para ello es necesario que exista una clase base (que incluso
puede formar parte de una jerarqua de clases ms amplia).

La clase derivada hereda el comportamiento y los atributos de


la clase base, y es comn que se le aada su propio
comportamiento o que modifique lo heredado.

Toda clase pueden servir como clase base para crear otras.

DESVENTAJAS:

Si la jerarqua de clases es demasiado compleja, el programador


puede tener problemas para comprender el funcionamiento de
un programa. Adems puede volverse ms complejo detectar y
resolver errores de programacin, por ejemplo al modificar una
clase padre que afecta el funcio0namiento de las subclases.

Otro problema es que las subclases se deben definir en cdigo,


por lo que los usuarios del programa no puede definir subclases
nuevas. Otros patrones de diseo permiten que los usuarios
puedan definir variantes de una entidad en tiempo de
ejecucin.

Herencia simple
Una clase slo puede heredar de una clase base y de ninguna
otra.
Herencia mltiple
Una clase puede heredar las caractersticas de varias clases
base, es decir, puede tener varios padres. En este aspecto hay
discrepancias entre los diseadores de lenguajes. Algunos de
ellos han preferido no admitir la herencia mltiple debido a que
los potenciales conflictos entre mtodos y variables con igual
nombre, y eventualmente con comportamientos diferentes crea
un desajuste cognitivo que va en contra de los principio de la
programacin orientada a objetos. Por ello, la mayora de los

lenguajes orientados a objetos admite herencia simple. En


contraste, algunos pocos lenguajes admiten herencia mltiple,
entre ellos: C++, Python, Eiffel, mientras
que Smalltalk, Java,Ada y C# slo permiten herencia simple.

La herencia es la transmisin del cdigo entre unas clases y otras.


Para soportar un mecanismo de herencia tenemos dos clases: la clase
padre y la/s clase/s hija/s. La clase padre es la que transmite su
cdigo a las clases hijas. En muchos lenguajes de programacin se
declara la herencia con la palabra "extends".

class Hija extends Padre{ }

Eso quiere decir que todo el cdigo de la clase padre se transmite, tal
cual, a la clase hija. Si lo quieres ver as, es como si tuvieras escrito,
lnea a lnea, todo el cdigo de la class "Padre" dentro de las llaves de
la class "Hija". Por eso, la herencia es fundamental para reutilizar
cdigo, porque no necesitas volver a incorporar el cdigo de Padre en
Hija, sino que realmente al hacer el "extends" es como si ya estuviera
ah.
Es una propiedad que permite que los objetos sean creados a partir
de otros ya existentes, obteniendo caractersticas (mtodos y
atributos) similares a los ya existentes. Es la relacin entre una clase
general y otra clase ms especfica. Es un mecanismo que nos

permite crear clases derivadas a partir de clase base, Nos permite


compartir automticamente mtodos y datos entre clases subclases y
objetos. Por ejemplo: Si declaramos una clase prrafo derivada de
una clase texto todos los mtodos y variables asociadas con la clase
texto son automticamente heredados por la subclase prrafo.
Este quizs es el tema que ms problemas causa al estudiante; sin
embargo, no es difcil en su concepcin.
El objeto Persona es un objeto muy genrico y limitado en s; as que
se puede considerar como un objeto Abstracto; ya que por s mismo
no puede crear una persona completa; sin embargo, sus funciones
bsicas son las mismas en todos los seres humanos, con diferencias
puntuales, as que podemos crear dos objetos Hombre y Mujer, que
hereden todas sus caractersticas genricas como respirar, hablar,
nombre, etc., del objeto Persona, y sea en la implementacin de cada
objeto donde empiecen las diferencias.
La herencia de clases es uno de los conceptos bsicos de
la programacin orientada a objetos. Decir que una clase hereda de otra
quiere decir que esa clase obtiene los mismos mtodos y propiedades
de la otra clase. Permitiendo de esta forma aadir a las caractersticas
heredadas las suyas propias.
Supongamos que tenemos una clase "Persona" con los mtodos y
propiedades bsicas de un objeto persona como podran ser
"caminar" o "hablar", podramos tener otras clases como "Guillermo"
o "Elder" que comparten todas las caractersticas de una "Persona"
pero que aaden caractersticas propias. Por lo que "Guillermo" y
"Elder" pueden realizar las mismas funciones que puede realizar una
"Persona" y adems cada una puede realizar las suyas propias, por
ejemplo, "Guillermo" sabe nadar pero "Elder" no, y "Elder" sabe bailar
reggaetn pero "Guillermo" no.
En trminos de programacin estaramos diciendo que "Guillermo" y
"Elder" son dos clases especializadas que heredan o extienden de la
superclase "Persona".
Existen dos tipos de herencia:

Herencia por especializacin

Herencia por generalizacin

En realidad la herencia es la misma, esta es una diferenciacin


puramente conceptual sobre la forma en que se ha llegado a ella.
Una herencia por especializacin es la que se realiza cuando
necesitamos crear una clase nueva que disponga de las mismas
caractersticas que otra pero que le aada funcionalidades. Por
ejemplo si tenemos una clase que genera un botn simple, y
necesitamos crear un botn que sea igual que el anterior pero que
adems aada un efecto al ser clicado.
La herencia por generalizacin es la que realizamos cuando tenemos
muchas clases que comparten unas mismas funcionalidades y por
homogeneizar las partes comunes se decide crear una clase que
implemente toda esa parte comn y se dejan solo las partes
especificas en cada clase. Por ejemplo si tenemos clases para dibujar
formas geomtricas todas ellas disponen de las mismas propiedades
(un color de fondo, color de lnea, etc...), todas estas caractersticas
pueden estar en una clase general de la que hereden todas las clases
concretas, evitando tener que escribir todo ese cdigo comn en
todas ellas.

POLIFORMISMO

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
Coche
miCoche = 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 Moto
miCoche = new Moto("Yamaha YBR");
//la lnea anterior nos dara un error en tiempo de
compilacin
Fjate que en este punto no te estoy hablando todava de
polimorfismo, sino de algo de la programacin en general como es el
sistema de tipos. Sin embargo, tienes que amoldar la cabeza a
esta restriccin de lenguajes fuertemente tipados para 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 recomiendo ver 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 un array, etc. Como ves, en estos lenguajes
como Java el tipado se lleva a todas partes.

Ahora 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 "Vehculo". Como se
ha explicado, en lenguajes fuertemente tapados slo podra contener

objetos de la clase Vehculo. 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 una clase hija de 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 "Vehculo", osea objetos de la clase "Coche", "Moto", "Bus"
o cualquier hija que se haya definido.

Volvamos 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 al play, 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 ejemplo por si acaso no ha quedado claro con lo visto
hasta el momento, volviendo de nuevo a la clase Vehculo. 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
entrada, 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 "Vehculo" 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 lenguajes basados en clases y con un sistema de tipos de 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 denominadas interfaces (esta
tcnica se conoce como composicin 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.1
En Java las interfaces se declaran mediante la palabra clave Interface.
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 que el 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, como Self, 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: Pez y Ave que
heredan de la superclaseAnimal. La clase Animal tiene el mtodo
abstracto mover que se 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 mensaje mover a un grupo de
objetos Pezy Avepor medio de una variable de referencia de
clase Animal, haciendo as un uso polimrfico de dichos objetos
respecto del mensaje mover.

El concepto de polimorfismo, desde una perspectiva ms general, se


puede aplicar tanto a funciones como a tipos de datos. As nacen los
conceptos de funciones polimrficas ytipos polimrficos. Las primeras
son aquellas funciones que pueden evaluarse o ser aplicadas a
diferentes tipos de datos de forma indistinta; los tipos polimrficos,
por su parte, son aquellos tipos de datos que contienen al menos un
elemento cuyo tipo no est especificado.
Se puede clasificar el polimorfismo en dos grandes clases:

Polimorfismo dinmico (o polimorfismo 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 (o polimorfismo ad 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 como programacin 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.
El polimorfismo como se muestra en el ejemplo anterior, suele ser
bastante ventajoso aplicado desde las interfaces, ya que permite
crear nuevos tipos sin necesidad de tocar las clases ya existentes
(imaginemos que deseamos aadir una clase Multiplicar), basta con
recompilar todo el cdigo que incluye los nuevos tipos aadidos. Si se
hubiera recurrido a la sobrecarga durante el diseo exigira retocar la
clase anteriormente creada al aadir la nueva operacin Multiplicar,
lo que adems podra suponer revisar todo el cdigo donde se
instancia a la clase.

Un mtodo est sobrecargado si dentro de una clase existen


dos o ms declaraciones de dicho mtodo con el mismo nombre
pero con parmetros distintos, por lo que no hay que confundirlo
con polimorfismo.

En definitiva: La sobrecarga se resuelve en tiempo de


compilacin utilizando los nombres de los mtodos y los tipos de
sus parmetros; el polimorfismo se resuelve en tiempo de

ejecucin del programa, esto es, mientras se ejecuta, en funcin


de la clase a la que pertenece el objeto.

ESTRUCTURA DINAMICA DE DATOS

Una de las aplicaciones ms interesantes y potentes de la memoria


dinmica y de los punteros son, sin duda, las estructuras dinmicas
de datos. Las estructuras bsicas disponibles en C y C++ (structs
y arrays) tienen una importante limitacin: no pueden cambiar de
tamao durante la ejecucin. Los arrays estn compuestos por un
determinado nmero de elementos, nmero que se decide en la fase
de diseo, antes de que el programa ejecutable sea creado.
En muchas ocasiones se necesitan estructuras que puedan cambiar
de tamao durante la ejecucin del programa. Por supuesto, podemos
crear arrays dinmicos, pero una vez creados, tu tamao tambin
ser fijo, y para hacer que crezcan o disminuyan de tamao,
deberemos reconstruirlos desde el principio.
Las estructuras dinmicas nos permiten crear estructuras de datos
que se adapten a las necesidades reales a las que suelen enfrentarse
nuestros programas. Pero no slo eso, como veremos, tambin nos
permitir crear estructuras de datos muy flexibles, ya sea en cuanto
al orden, la estructura interna o las relaciones entre los elementos
que las componen.

Las estructuras de datos estn compuestas de otras pequeas


estructuras a las que llamaremos nodos o elementos, que agrupan los
datos con los que trabajar nuestro programa y adems uno o ms
punteros autorreferenciales, es decir, punteros a objetos del mismo
tipo nodo.
Dependiendo del nmero de punteros y de las relaciones entre nodos,
podemos distinguir varios tipos de estructuras dinmicas.
Enumeraremos ahora slo de los tipos bsicos:

Listas abiertas: cada elemento slo dispone de un


puntero, que apuntar al siguiente elemento de la lista o
valdr NULL si es el ltimo elemento.

Pilas: son un tipo especial de lista, conocidas como listas


LIFO (Last In, First Out: el ltimo en entrar es el primero
en salir). Los elementos se "amontonan" o apilan, de
modo que slo el elemento que est encima de la pila
puede ser ledo, y slo pueden aadirse elementos
encima de la pila.

Colas: otro tipo de listas, conocidas como listas FIFO (First


In, First Out: El primero en entrar es el primero en salir).
Los elementos se almacenan en fila, pero slo pueden
aadirse por un extremo y leerse por el otro.

Listas circulares: o listas cerradas, son parecidas a las


listas abiertas, pero el ltimo elemento apunta al primero.
De hecho, en las listas circulares no puede hablarse de
"primero" ni de "ltimo". Cualquier nodo puede ser el
nodo de entrada y salida.

Listas doblemente enlazadas: cada elemento dispone de


dos punteros, uno a punta al siguiente elemento y el otro
al elemento anterior. Al contrario que las listas abiertas
anteriores, estas listas pueden recorrerse en los dos
sentidos.

Arboles: cada elemento dispone de dos o ms punteros,


pero las referencias nunca son a elementos anteriores, de
modo que la estructura se ramifica y crece igual que un
rbol.

Arboles binarios: son rboles donde cada nodo slo puede


apuntar a dos nodos.

Arboles binarios de bsqueda (ABB): son rboles binarios


ordenados. Desde cada nodo todos los nodos de una
rama sern mayores, segn la norma que se haya
seguido para ordenar el rbol, y los de la otra rama sern
menores.

Arboles AVL: son tambin rboles de bsqueda, pero su


estructura est ms optimizada para reducir los tiempos
de bsqueda.

Arboles B: son estructuras ms complejas, aunque


tambin se trata de rboles de bsqueda, estn mucho
ms optimizados que los anteriores.

Tablas HASH: son estructuras auxiliares para ordenar


listas.

Grafos: es el siguiente nivel de complejidad, podemos


considerar
estas
estructuras
como
rboles
no
jerarquizados.

Diccionarios.

Las estructuras dinmicas de datos son estructuras que cuya


dimensin puede crecer o disminuir durante la ejecucin del
programa. Una estructura dinmica de datos es una coleccin
de elementos llamados nodos. Al contrario que un array, que
contiene espacio para almacenar un nmero fijo de elementos,
una estructura dinmica de datos se ampla y contrae durante
la ejecucin del programa.
Las estructuras dinmicas de datos se pueden dividir en dos
grandes grupos:
Lineales: listas enlazadas, pilas, colas
No lineales: rboles , grafos
Las estructuras dinmicas de datos son de gran utilidad para
almacenar datos del mundo real, que estn cambiando
constantemente. Por ejemplo si tenemos almacenados en un
array los datos de los alumnos de un curso, los cuales estn
ordenados de acuerdo al promedio, para insertar un nuevo
alumno sera necesario correr cada elemento un espacio: Si en
su lugar se utilizara una estructura dinmica de datos, los
nuevos datos del alumno se pueden insertar fcilmente.

BIBLIOGRAFA:

www.c.conclase.net/edd/?cap=008c
https://kesquivel.files.wordpress.com/2014/08/estructuras-dinamicas.pdf
www.desarrolloweb.com/.../polimorfismo-programacion-orientada-objet
https://es.wikipedia.org/wiki/Polimorfismo_(informtica)

https://damian02.wordpress.com/polimorfismo-poo/
https://es.wikipedia.org/wiki/Herencia_(informtica)
www.desarrolloweb.com/.../herencia-en-programacion-orientada-objetos
https://damian02.wordpress.com/herencia-poo-2/

Вам также может понравиться