Java - POO interfaces

 
Vista:

POO interfaces

Publicado por José (1 intervención) el 03/04/2022 21:47:24
Buenas tardes ¿Cuál sería la diferencia entre una interfaz abstracta y una concreta?
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

POO interfaces

Publicado por Kabuto (1383 intervenciones) el 03/04/2022 23:14:56
¿Seguro que esa es la pregunta correcta? ¿Interfaces concretas?

Hasta donde yo se (puedo estar equivocado), las clases si podemos diferenciarlas entre abstractas y concretas.
Pero las interfaces,... no hay tal clasificación.
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
sin imagen de perfil

POO interfaces

Publicado por José (4 intervenciones) el 04/04/2022 18:55:50
Hola es que en un material que yo tengo dice esto: En general, las clases reutilizables tienden a tener interfaces que son más abstractas que concretas. Las interfaces concretas tienden a ser muy específicas, mientras que las abstractas son más generales. Sin embargo, afirmar simplemente que una interfaz muy abstracta es más útil que una interfaz muy concreta, aunque a menudo es cierto, no siempre es así.
y luego preguntaba que ¿Cuál era la diferencia entre una interfaz abstracta y una concreta?

¿Podría aclararme eso?
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

POO interfaces

Publicado por Kabuto (1383 intervenciones) el 04/04/2022 19:57:29
Pues...., por más que busco en Google, no encuentro nada sobre "interfaces concretas" o "interfaces abstractas".
Como ya dije, con las clases sí existe esa distinción. Pero con las interfaces..., primera vez que oigo algo al respecto.

Así que no se a qué se refiere ese texto. Además, resulta extraño que diga "interfaces muy abstractas...".
¿Cómo que "muy"?
Aquí no cabe expresarse en términos de "mucho" o "poco". O es abstracta, o no lo es.

Siento no poder aclararte tu duda, pero es que desconozco a qué se están refiriendo..
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

POO interfaces

Publicado por José (4 intervenciones) el 04/04/2022 20:12:05
Si eso estaba viendo. En caso de que fuera clase y clase ¿Cuál sería la diferencia entre estas dos? Y sabes de algún ejemplo cómo para poder asimilar la diferencia entres estas clases abstracta y concreta? Perdona la insistencia.
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

POO interfaces

Publicado por Kabuto (1383 intervenciones) el 05/04/2022 11:51:05
A ver si consigo dar una explicación "no académica", sin enredarme demasiado con la filosofía POO.

Las clases lo que hacen es representar "entidades" y/o conceptos del mundo real: Una persona, un coche, un hotel, una clase de alumnos, un avión, el motor de un avión, un simple tornillo del motor de un avión, un punto espacial dentro de una figura geométrica, una ecuación matemática, el texto de un libro, etc...

Para modelar estas entidades/conceptos podemos usar clases concretas, es decir, una clase que representa por completo todo lo que necesitamos modelar de una entidad.

Supón una granja de animales y queremos representar cada animal de la granja.

Tendríamos la clase Vaca con los atributos (y sus correspondientes métodos):
1
2
3
4
5
- raza
- peso
- edad
- tamaño
- litrosLecheProporciona
Clase Cabra
1
2
3
4
5
- raza
- peso
- edad
- tamaño
- calidadEstiercol
Clase Oveja
1
2
3
4
5
- raza
- peso
- edad
- tamaño
- fechaUltimoTrasquilado
Clase Gallina
1
2
3
4
5
- raza
- peso
- edad
- tamaño
- calidadHuevos
Clase Caballo
1
2
3
4
5
- raza
- peso
- edad
- tamaño
- esSemental

Y lo mismo con todos los animales que puedan haber en una granja.
Bien, si te fijas, todos ellos tienen una serie de atributos comunes. Entonces, si vamos a tener que representar a yo que se, 50 tipos de animales distintos, pues es absurdo escribir 50 veces el código para representar los mismos atributos, además de sus métodos getter/setter.

Aquí nos interesa modelar esos atributos/métodos que son comunes en una sola clase, y hacer que el resto hereden de esta clase.

Como todas estas entidades son animales, pues haremos una clase Animal con dichos atributos/métodos:
1
2
3
4
5
6
public class Animal {
    private String raza;
    private double peso
    private int edad
    private double tamaño
}
Y ya luego, cada clase heredará de Animal y aportará sus atributos propios:
1
2
3
public class Vaca extends Animal {
    private int litrosLecheProporciona;
}

Vale, hasta aquí lo que hemos hecho es explicar la herencia entre clases y lo provechosa que es.

Siguiendo con la filosofía POO, ahora nos tenemos que preguntar si queremos o no, que en nuestra aplicación se puedan instanciar objetos de la clase Animal

En las bases de datos de nuestra granja, vamos a querer trabajar directamente con objetos Vacas, Gallinas, Ovejas,... es decir, con entidades concretas
1
2
3
4
5
6
//Creo un objeto Vaca
Vaca vaca1 = new Vaca();
//Indico los litros que me está proporcionando
vaca1.setLitrosLeche(45);
//Guardo en su array correspondiente
listaVacas.add(vaca1);
1
2
3
4
5
6
//Creo un objeto Caballo
Caballo caballo1 = new Caballo();
//Indico si es un semental
caballo1.setEsSemental(true);
//Guardo en su array correspondiente
listaCaballos.add(caballo1);

Sin embargo, no vamos a querer trabajar con objetos de clase Animal. No nos sirve tener simplemente un "animal", sin saber si es un Caballo, una Vaca o un Ratón...
Con un simple "animal", no se en que array guardarlo ni que propiedad exclusiva tiene: ¿da leche?¿da lana?¿puede tirar de un arado?
1
2
3
//Creo un objeto animal
Animal animal1 = new Animal();
//Ahora..., pues no se donde guardarlo ni para que me sirve este objeto

¿Entiendes por donde voy?
Un Caballo o una Vaca, son entidades concretas, y las puedo clasificar y operar con sus cualidades exclusivas.
Pero un Animal, es una entidad abstracta, no la puedo clasificar y no tiene definida ninguna cualidad exclusiva con la que operar.

Esa es la diferencia entre abstracta y concreta. Una clase abstracta es como un "boceto", tiene lo primordial para representar una entidad/concepto, pero no lo suficiente para terminar de concretar ese concepto.

Por eso, en nuestro código, la clase Animal la vamos a declarar como abstracta:
1
2
3
4
5
6
public abstract class Animal {
    private String raza;
    private double peso
    private int edad
    private double tamaño
}

Esto sirve para que si otra persona va a utilizar nuestro código, enseguida sabrá que la clase Animal no está pensada para trabajar con ella directamente, sino que es una entidad abstracta de la que van a heredar otras clases concretas.
Es más, ahora en el código, nuestro lenguaje de programación no nos va a permitir crear objetos de esa clase Animal
1
2
//El compilador lanzará mensaje de error si intentamos instanciar un Animal, porque esta clase la hemos declarada como abstracta
Animal animal1 = new Animal(); //Error

Mas ejemplos:
Una empresa donde sus empleados son: Contable, Informatico, Comercial, JefeSeccion, Secretario, Tesorero,...
Todas esas son entidades concretas, que nacen de una entidad abstracta: Empleado

Un taller de reparación de vehículos trabaja con : Motocicleta, Turismo, Furgon, Camion, AutoBus,...
Son las entidades concretas, que nacen de la entidad abstracta: Vehículo.

Un programa que dibuja figuras geométricas es capaz de representar en pantalla: Círculo, Triangulo, Rectángulo, Pentágono, Hexágono, Cubo, Prisma, Cilindro, Cono, Esfera,....
Son entidades concretas modeladas a partir de una entidad abstracta: FiguraGeometrica

Así que como puedes ver, es muy habitual encontrar situaciones donde para representar muchas entidades concretas, podemos ahorrarnos trabajo si las creamos a partir de una entidad abstracta que modele todos los atributos comunes compartidos por esos conceptos concretos.

Espero que tanto escribir, haya servido para aclarar algo.
Un saludo.
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

POO interfaces

Publicado por Tom (1831 intervenciones) el 05/04/2022 18:59:13
No sé si le habrás aclarado algo, @Kabuto, porque probablemente no tiene mucha idea de esto.
Pero es posible, solamente posible, que el asunto gire en torno a esto:

https://www.baeldung.com/java-static-default-methods

Ya que aunque un interface es, por definición, abstracto (y queda claro en la especificación de java) ... desde java 8 se pueden definir métodos "default" y estáticos en un interface.
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