Java - Polimorfismo en Java

 
Vista:

Polimorfismo en Java

Publicado por carlosVallSego (4 intervenciones) el 18/11/2022 00:17:54
Hola a todos, tengo una duda sobre el Polimorfismo en Java, si se llama así. Si tengo una clase que se llama Shape y creo otra que se llama Rectangle que extiende a Shape:


¿Que diferencia hay de hacer esto?

1
Shape s = new Rectangle("20",20,30,15,10,"Saludos desde un rectangulo ");

A esto:

1
Rectangle s = new Rectangle("20",20,30,15,10,"Saludos desde un rectangulo ");


He probado de ambas formas y accedo a las propiedades y metodos de la clase Shape de la misma forma en ambos casos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Polimorfismo en Java

Publicado por Kabuto (1381 intervenciones) el 18/11/2022 09:26:10
1
2
He probado de ambas formas y accedo a las propiedades y metodos de la clase Shape
 de la misma forma en ambos casos.

Sí pero..., ¿puedes acceder a las propiedades y métodos de la clase Rectangle en ambos casos?
He ahí la diferencia.


Normalmente las clases hijas tienen más propiedades y métodos que sus clases madres.

Entonces, en esta línea:
1
Shape s = new Rectangle("20",20,30,15,10,"Saludos desde un rectangulo ");

Has construido un Rectangle, pero instanciado como Shape, así que solo tendrás los métodos y propiedades propios de Shape

Eso no significa que los haya perdido, simplemente no están accesibles con su "forma" (morfo) actual.

Si luego haces lo que se llama un casting para cambiar su "forma", podrás acceder a sus propiedades.

1
2
3
4
5
6
//Este Rectangle, se comporta como un Shape. Disponemos de las propiedades de un Shape, pero no de un Rectangle
Shape s = new Rectangle("20",20,30,15,10,"Saludos desde un rectangulo ");
//Hacemos casting
Rectangle r = (Rectangle) s;
//Ahora en r tenemos el mismo Rectangle y podremos acceder a su métodos y propiedades
r.getAreaRectangle();

Por eso se llama polimorfismo, porque un objeto puede tener muchas(poli) formas(morfos), siempre que haya una relación de herencia entre esas formas.
Y esa relación ha de ser ascendente

Es decir, un Rectangle puede tener forma de Rectangle y de Shape.
Pero un Shape, solo puede ser un Shape.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Polimorfismo en Java

Publicado por carlosVallSego (4 intervenciones) el 22/11/2022 21:47:34
Hola Kabuto perdona por no responder antes, he tenido fin de semana con mucho trabajo. Me ha quedado claro, pero ¿que sentido tiene crear una clase hija dentro de la clase padre si vas a perder los métodos y propiedades de la hija? Al revés si lo tiene, heredas métodos y propiedades publicas y protected de la clase padre.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Polimorfismo en Java

Publicado por Kabuto (1381 intervenciones) el 22/11/2022 23:44:32
Cierto, no tiene mucho sentido y yo al menos nunca he hecho tal cosa.
Si que lo he visto a veces en ejemplos, sobre todo con List y ArrayList
1
List<Persona> listado = new ArrayList<Persona>();
Pero nunca he comprendido el motivo.


Eso en cuanto a instanciar una clase hija directamente como clase madre.


Sin embargo, sí hay otros escenarios donde, indirectamente, objetos de la clase hija los instanciaremos como clase madre.

Por ejemplo, imagina que Shape tiene varias hijas: Rectangle, Circle, Triangle, Cone,....

Y queremos tener una colección, un ArrayList por ejemplo, amplia de varios objetos de todas estas figuras.
Para poder tenerlas todas juntas en una sola colección, el ArrayList lo declararemos de tipo Shape, aunque luego cada objeto sea instanciado como alguna de las clases hijas:

1
2
3
4
5
6
7
8
9
10
ArrayList<Shape> figuras = new ArrayList<Shape>();
 
figuras.add(new Rectangle());
figuras.add(new Circle());
figuras.add(new Rectangle());
figuras.add(new Triangle());
figuras.add(new Cone());
figuras.add(new Circle());
...
...

O también si queremos hacer un método que, por decir algo, pueda recibir dos figuras distintas y compararlas para ver cuál tiene el área más grande.
En ese caso, al declarar el método los argumentos también tendremos que declararlos como Shapes :
1
2
3
public void compararFiguras(Shape fig1, Shape fig2) {
 
}

Así luego admitirá figuras de cualquier tipo:

1
2
3
Circle circulo = new Circle();
Cone cono = new Cone();
compararFiguras(circulo, cono);


Estos son algunos de los escenarios donde el polimorfismo nos hace la vida más fácil.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar