Java - Ayuda con clases abstractas

 
Vista:

Ayuda con clases abstractas

Publicado por Oscar (1 intervención) el 14/06/2019 10:30:30
Tengo que realizar esta practica pero no se muy bien como empezar, estaría muy agradecido si alguien me ayudara.


Practica:
Una compañía paga a sus empleados por semana los empleados son de cuatro tipos:
- Empleados asalariados que reciben un salario semanal fijo, isn importar el número de horas trabajadas.
- Empleados por horas, que reciben un sueldo por hora y pago por tiempo extra, por todas las horas trabajadas que excedan 40 horas.
- Empleados por comisión, que recien un porcentaje de sus ventas.
- Empleados asalariados por comisión, que reciben un salario base más un porcenaje de sus ventas.
Para este período de pago, la compañía ha decidido recompensar a los empleados asalariados por comisión, agregando un 10% a sus salarios base. La
compañía desea implementar una aplicación en Java que realice sus cálculos de nómina en forma polimórfica.

voy empezando en POO y no entiendo muy bien el polimorfismo y las clases abstractas
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

Ayuda con clases abstractas

Publicado por Kabuto (1381 intervenciones) el 14/06/2019 12:10:51
Hola, la palabra polimorfismo suena muy rimbombante..., pero no tiene ningún misterio y tiene un significado muy obvio.

Piensa por ejemplo en las personas que se conectan a este foro, o a cualquier otro.
Algunos son Administradores, otros son Moderadores y la mayoría, como tu y yo, somos Usuarios
Cada uno tiene unas funciones y atributos específicos según su categoría.
Pero, puesto que todos somos Personas, vamos a tener ciertos atributos comunes como el nombre, email de registro o la contraseña.

Así que tu y yo somos Usuarios con atributos especificos como por ejemplo el número de mensajes publicados en el foro. Atributo que quizás no tenga un Administrador
Pero todos tenemos atributos comunes que heredamos de la clase Persona.

Esto en programación implica que cuando queramos acceder a nuestro nombre o email, el programa nos va a considerar un objeto Persona.
Pero cuando queramos acceder al número de mensajes publicados, el programa nos considerará un objeto Usuario.

Eso es el polimorfismo (muchas formas).


Sobre tu ejercicio.
Vas a tener empleados con atributos comunes tipicos, por ejemplo, DNI, nombre y apellido.

Pero luego cada empleado tienen distintas formas de como calcular su salario.

Así que tendrás 4 tipos de empleados y todos van a heredar del tipo empleado "básico".

Por tanto, deberías crear una clase Empleado con los atributos comunes y que el resto de clases hereden de ella, siendo:
1 - Empleados asalariados
2 - Empleados por horas
3 - Empleados por comisión
4 - Empleados asalariados por comisión

Incluso el tipo 4 de Empleado, si te fijas, en realidad podría heredar del tipo 1. Ya que ambos tienen un salario semanal fijo, solo que el cuarto tipo además tiene un porcentaje de comision de sus ventas.

Este diagrama UML que he hecho rapidito, nos da una idea de las herencias entre estas clases.
Los atributos no se si serán los más idoneos, como digo, lo he hecho rápido sin pensarlo mucho a modo de ejemplo.

empleados


Pues si estamos de acuerdo con esas herencias, el siguiente paso es escribir las clases.
De momento no pienses en como se harán los cálculos de los salarios para cada uno. Simplemente escribe las clases teniendo en cuenta que TODAS van a tener un método encargado de calcular su salario.

Dicho método por cierto, se podría declarar también como asbtracto en la clase Empleado. Así el resto de clases que hereden de Empleado, obligatoriamente van a tener que incluir este método, aunque ya luego cada una hará los cálculos de forma distinta.

Mira el siguiente código podría ser la clase Empleado.
Fíjate que la declaro como abstracta. Esto es porque no vamos a querer tener objetos que sean únicamente Empleados.
Al declararla como abstracta jamás podremos hacer:
Empleado emple = new Empleado();

Una clase abstracta no sirve para crear objetos de dicha clase, solo sirve para que otras clases hereden de ella.

Fíjate también que al final está declarado el método calcularSalario() como abstracto, sin código ni nada.
Esto es lo que obliga a las clases que hereden de Empleado, a implementar este método y dotarles del código necesario para cumplir su función.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public abstract class Empleado {
 
	private String dni;
	private String nombre;
	private String apellido;
 
	public Empleado(String dni, String nombre, String apellido) {
		this.dni = dni;
		this.nombre = nombre;
		this.apellido = apellido;
	}
 
	public String getDni() {
		return dni;
	}
 
	public void setDni(String dni) {
		this.dni = dni;
	}
 
	public String getNombre() {
		return nombre;
	}
 
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
 
	public String getApellido() {
		return apellido;
	}
 
	public void setApellido(String apellido) {
		this.apellido = apellido;
	}
 
	public abstract Double calcularSalario();
 
}


Pues a partir de esta clase, crea las siguientes haciendo que hereden de esta.

Luego, ya pensarás en como hacer los cálculos de salarios.

Si te atascas con lo que sea, muestra por aquí tu código y te ayudamos.
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
1
Comentar
sin imagen de perfil
Val: 973
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ayuda con clases abstractas

Publicado por Agustin (170 intervenciones) el 14/06/2019 15:47:31
Me van a downvotear los fans de aca, pero te la tiro igual:

No te conviene aprender OOP con java, es un lenguaje que mete mucho ruido innecesario. Por ejemplo, porque no tiene properties, y te obliga a escribir toneladas de codigo adicional que en realidad no aporta nada, y por lo tanto no sirve para nada.

Te conviene usar cualquier lenguaje moderno y usable, para entender mas facil y de manera menos ruidosa y poder aplicar los conceptos básicos de OOP, sin tener que estar lidiando con un lenguaje obsoleto que se quedó en 1999 como java.

Fijate que en el ejemplo que te dieron hay 39 (!!!!) lineas de codigo para declarar una clase con 3 properties, cuando en otros lenguajes lo haces con 5 lineas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-5
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

Ayuda con clases abstractas

Publicado por Kabuto (1381 intervenciones) el 14/06/2019 18:04:55
Hola Agustin, ¿podrias poner un ejemplo de como quedaría esa misma clase en otro lenguaje y 5 líneas como dices?
En absoluto pretendo confrontar ni nada de eso, solo quiero conocer cosas nuevas.

Por otra parte, he de decir que el ejemplo que he puesto tiene 39 líneas porque a los atributos se les puede acceder únicamente por getters y setters

Ahora bien, si pongo los atributos como public y no private, puedo quitar getters/setters.
Si me apuras, hasta puedo quitar el constructor y dejarla así:

1
2
3
4
5
6
7
8
public abstract class Empleado {
 
	public String dni;
	public String nombre;
	public String apellido;
 
	public abstract Double calcularSalario();
}


Ya tengo esa misma clase en 5 líneas. Y en Java...

Solo que de este modo rompo con el principio de encapsulamiento, algo propio de cualquier lenguaje orientado a objetos.

¿Con lo que mencionas de los properties esas de otros lenguajes, se puede hacer lo mismo sin romper dicho principio?

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
sin imagen de perfil
Val: 973
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Ayuda con clases abstractas

Publicado por Agustin (170 intervenciones) el 14/06/2019 19:57:29
¿podrias poner un ejemplo de como quedaría esa misma clase en otro lenguaje y 5 líneas como dices?

C#:

1
2
3
4
5
6
7
public abstract class Empleado
{
    public string Dni { get; set; }
    public string Nombre { get; set; }
    public string Apellido { get; set; }
    public abstract decimal CalcularSalario();
}

Kotlin:

1
2
3
4
5
6
7
abstract class Empleado {
    var dni: String = ""
    var apellido: String = ""
    var nombre: String = ""
 
    abstract fun calcularSalario()
}

TypeScript:

1
2
3
4
5
6
7
abstract class Person {
    dni: string;
    var apellido;
    var nombre;
 
    abstract calcularSalario(): Number;
}

O sea, te estoy mostrando 3 lenguajes diferentes, que corren sobre plataformas diferentes:

C# corre sobre .NET
Kotlin corre sobre la JVM (al igual que java)
TypeScript compila a JavaScript y corre sobre el browser o en el server usando node.js

Fijate que en TODOS los casos la sencillez y productividad de estos lenguajes contrasta con la patética idiosincracia retrógrada de java, donde se requiere casi DIEZ VECES más código para obtener el mismo resultado.

Adicionalmente, como este ejemplo te puedo dar decenas, de cuestiones que se resuelven con un par de líneas de código en cualquier lenguaje moderno y usable, y requieren toneladas de ruido inservible en java.

En cambio, no existe NINGUN ejemplo en java de ninguna cosa que se pueda realizar más fácil o de forma más sencilla y práctica. La practicidad no es un aspecto que le interese a java, ni tampoco la productividad. Esto queda demostrado.

Por otra parte, he de decir que el ejemplo que he puesto tiene 39 líneas porque a los atributos se les puede acceder únicamente por getters y setters

Como te acabo de mostrar, en cualquier lenguaje moderno el concepto de "getters" y "setters" es innecesario, ya que está resuelto a nivel de lenguaje. C# por ejemplo, al compilar el fragmento de código de arriba, genera de forma automática los "getters" y "setters" dentro del binario compilado. Vos nunca los ves ni los referencias. Ademas, C# especificamente con las properies tiene una serie de ventajas respecto de java, que si querés te las menciono aparte.

Ahora bien, si pongo los atributos como public y no private, puedo quitar getters/setters.
Si me apuras, hasta puedo quitar el constructor y dejarla así:

Ya tengo esa misma clase en 5 líneas. Y en Java...
Solo que de este modo rompo con el principio de encapsulamiento, algo propio de cualquier lenguaje orientado a objetos.


Exacto. java no soporta ninguna forma productiva de hacer las cosas de manera correcta. Cosa que si sucede en cualquier lenguaje moderno y usable.

Como dije, te puedo dar cientos de ejemplos de cosas que se resuelven muy facil en lenguajes modernos y en cambio son terriblemente tediosas y trabajosas de hacer en java.

Todo esto lleva a una sola conclusión: java no tiene absolutamente ninguna ventaja respecto de cualquier lenguaje estático moderno, con lo cual se considera OBSOLETO.

Las únicas personas que continuan utilizando java son aquellos que no conocen ningún lenguaje moderno. TODAS las empresas grandes que alguna vez usaron java se han movido a lenguajes más productivos y modernos: te puedo nombrar el caso de NetFlix, Twitter, y un laargo etc que están utilizando lenguajes como Kotlin o Scala del lado del servidor. Incluso google declaró hace poco que Kotlin es el lenguaje preferido para desarrollo sobre Android.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-4
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

Ayuda con clases abstractas

Publicado por Kabuto (1381 intervenciones) el 14/06/2019 20:03:05
¡¡Gracias por los ejemplos!!
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