Poliformismo - JAVA - Ejemplos

SoyLoPeor

Buenas, estoy buscando una web donde expliquen a fondo el poliformismo.

Las que he encontrado tienes ejemplos muy pobres o tocan el tema muy de pasada.

Un saludo.

cabron

El polimorfismo es algo genérico, es mejor que entiendas el concepto en sí, más que ver código java.

Imagina una clase con el método CalcularPerimetro:

clase forma
{

    CalcularPerimetro();

}

Ahora derivamos dos clases de la clase forma, una es rectangulo, y otra pentagono.

Clase rectangulo :: forma
{
CalcularPerimetro();
}

Clase pentagono :: forma
{
CalcularPerimetro()
}

Rectangulo y pentagono son formas, pero cada una calcula su perimetro de forma diferente, por eso cada una tiene su función perimetro.

Ahora imagina que tienes una variable de tipo forma:

forma objeto;

Pues bien, el polimorfismo dice que puedes hacer esto:

objeto = devolverForma();

objeto.CalcularPerimetro();

devolverForma() puede devolver un objeto rectangulo, o un objeto pentagono, no sabes cual de las dos cosas va a devolver, y te da igual, tu simplemente llamas a CalcularPerimetro, y según si es un pentagono o un rectangulo, se usara la función correcta (la del pentagono o la del rectangulo).

Eso es el polimorfismo.

1
IS4kO

Muy a groso modo... yo creo que con el siguiente ejmplo se entiende rapidamente y no se te olvida nunca más...

Imagínate que tenemos una clase coche, esta es polimorfica, pq a través de ella, podemos obtener si el coche tiene e o no faros delanteros... si el coche es rojo, si vuela, si tiene matricula española, etc...

Es decir, que una clase es polimorfica, cuando puede devolver varios (poli) resultados dependiendo de su uso..

Edit: y cuando digo de su uso me refiero al uso que necesitemos desde los objetos que la instancien..

kas

No estoy de acuerdo del todo con esa definicion, Isako.

Creo que el ejemplo de antes era bastante mas claro. Con tu ejemplo quedaria una cosa asi.

Tienes la clase coche. Bien. Esta clase tiene algunas funciones publicas, como son:

Potencia();
NumeroDePlazas();

Ahora, esta es una SuperClase, es decir, es la mas general. Esto quiere decir, que tu puedes definir el Seat Leon.

El Seat Leon es un coche verdad? Pero puede diferir en potencia y nº de plazas del (inalcanzable) Porsche CarreraGT. Pero no desplazes tu atencion, éste ultimo TAMBIEN tiene un una potencia y un numero de plazas.

El truco esta en poder usar ambos INDISTINTAMENTE, sin necesidad de IFs ni SWITCHs (select case's en VB), ni nada. Como? Muy facil:

Definamos las clases:

Class Coche
{
....NPlazas();
....Potencia();
}

Class SeatLeon :: Coche
{
....NPlazas()
....{
........return 5;
....}
....Potencia()
....{
........return 150;
....}
}

Class PorscheCarreraGT :: Coche
{
....NPlazas()
....{
........return 2;
....}
....Potencia()
....{
........return 650;
....}
}

Ahora, como usarlas?

Ejemplo de uso:

Coche myCoche = new SeatLeon();
printf(mycoche.NPlazas() + " asientos - " + mycoche.Potencia() + "cv");
myCoche = new PorscheCarreraGT ();
printf(mycoche.NPlazas() + " asientos - " + mycoche.Potencia() + "cv");

El resultado seria este:

5 asientos - 150cv
2 asientos - 650cv

Sin embargo tu no has tenido que definir una variable de cada tipo.

Espero que haya quedad claro.

SoyLoPeor

A ver, quizas no me he sabido explicar.

Se que es el poliformismo, pero necesito ejemplos complejos de su utilizacion aplicada en varias clases.

Evidentemente no espero que nadie se pegue aqui el curro de hacer codigo de varias clases aplicandolo, asi que lo que pido son ejemplos en webs que profundicen en el tema.

#2 Es curioso, pero cuando di hace tiempo poliformismo y herencia el profesor utilizo ese mismo ejemplo, el de las figuras y su area x)

Espero que ahora se me haya entendido.

Soltrac

#5 pq ese ejemplo es mítico y es el mismo q utilizó mi profesor cuando dimos polimorfimos en C++ xDDDD

Cyph3r

A mi tb pero en java xDD

oFF-sIDE

#2 lo ha definido a la perfección.

Una clase tiene distintas clases q la extienden.

Podemos tener una clase Figura, y 2 subclases: Rectangulo y Circulo. Pero cada una tiene sus propios métodos, porque no es lo mismo calcular el perimetro de un Rectangulo (base x altura) q el de un circulo (2 x MATH.pi x radio).

Cuando crees una figura lo podrás hacer de las siguientes formas:

Figura f = new Figura();
Figura f = new Circulo();
Figura f = new Rectangulo();

O puedes crear directamente las formas especificas:

Rectangulo r = new Rectangulo();
Circulo c = new Circulo();

Viene a ser lo q ha dicho #2, q lo ha dejado muy claro :)

No estoy de acuerdo con #3

IS4kO

Creo que todos estamos diciendo lo mismo, pero bueno, por si no se entendió mi ejemplo... cambiemos clase coche por clase Vehiculo... en un pseudocodigo salchichero:

clase Vehiculo
{
property color();
property peso();
property numRuedas();
property matricula();
funcion verKilometraje();
}
Clase Moto : Vehiculo
{
verKilometraje();
.
.
}
Clase Tanke : Vehiculo
{
verKilometraje();
.
.
}
.
.
miMoto as new moto;
miMoto.numRuedas=2;
.....

Creo que así se ve más claro..

Shaktale

http://javabasico.osmosislatina.com/curso/polimorfismo.htm he encontrao una cosilla por aki k te parecera interesante

SoyLoPeor

#10 Muchas gracias, es bastante mas de lo que habia logrado encontrar yo.

kas

Sinceramente creo que los mas dificil del polimorfismo es el nombre.

cabron

Es que yo también lo aprendí con el ejemplo de las formas, por eso lo he usado.

cracking

polimorfismo.

  1. m. Cualidad de lo que tiene o puede tener distintas formas.

  2. m. Biol. Propiedad de las especies de seres vivos cuyos individuos pueden presentar diferentes formas o aspectos, bien por diferenciarse en castas, como las termitas, bien por tratarse de distintas etapas del ciclo vital, como la oruga y la mariposa.

  3. m. Bioquím. Propiedad de los ácidos nucleicos y las proteínas que pueden presentarse bajo varias formas moleculares. Es un fenómeno importante en la genética y en la patología molecular.

  4. m. Quím. Propiedad de los elementos y sus compuestos, que pueden cambiar de forma sin variar su naturaleza.

Real Academia Española © Todos los derechos reservados

Tig

Que manera de haceros la picha un lio :S

Ya no hacen falta más ejemplos, ¿no?

kas

Es que no hay mas ejemplos... es algo tan sencillo como usar una sola variable para almacenar diferentes objetos, que se relacionan entre si gracias a la herencia o a la implementacion de una interfaz comun.

elkaoD

Lo que mola es el polimorfismo en ASM, programas que se modifican a sí mismos en memoria en ejecución. Divertidísimo, sobre todo de debuggear xD

cabron

#17:

Modificar un programa en tiempo de ejecución para que cambie su comportamiento, se llama "Procedural generation", no tiene que ver con el polimorfismo.

Lo de "polimorfismo en asm" no tiene sentido, ya que cuando haces polimorfismo en cuaqluier lenguaje, al final acaba siendo compilado/interpretado a código máquina, y aunque nunca he implementado un compilador de ningún lenguaje que permita polimorfismo y no sé exáctamente que solución se usa, si tengo una ligera noción de que se hace con tablas que mantienen las direcciones de llamada a los métodos de cada clase, no tiene nada que ver con que el programa se modifique a sí mismo en tiempo de ejecución.

elkaoD

#18, ok, algo nuevo que aprendo. Yo (Y todos los que lo hemos usado que conozco, la mayoría de listas de ingeniería inversa) siempre lo he llamado polimorfismo, pero si dices que se llama así, pues será.

kas

#17 Eso en .NET se puede hacer con Reflection y es bastante divertido.

Usuarios habituales

  • kas
  • elkaoD
  • cabron
  • SoyLoPeor
  • IS4kO
  • oFF-sIDE
  • Cyph3r