Autor Tema: Herencia Java  (Leído 2421 veces)

drate

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 24
    • Ver Perfil
Herencia Java
« en: 02 de Febrero 2023, 20:01 »
Buenas tardes.
Estoy haciendo un ejercicio de herencia con una superclase y dos subclases. Me piden en el main implementar un solo objeto de una de las subclases con todos sus métodos pero necesito el atributo junto con sus operaciones de la otra subclase.
Alguna sugerencia?
Muchas gracias, un saludo.

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Re: Herencia Java
« Respuesta #1 en: 06 de Febrero 2023, 20:33 »
Buenas, no se entiende bien lo que hay que hacer, si lo explicas mejor a lo mejor alguien puede dar alguna idea. ¿Puedes explicarlo mejor, o poner un ejemplo de lo que se quiere? ¿Has visto ejemplos del curso Java desde cero: https://aprenderaprogramar.com/index.php?option=com_content&view=category&id=68&Itemid=188?


Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re: Herencia Java
« Respuesta #2 en: 07 de Febrero 2023, 00:10 »
Creo que ya respondí a esta duda, o una muy similar, por mensaje privado, pero no encuentro la respuesta que te envié.
He ahí otro motivo por el que no me gusta responder consultas por privado.

Pero vamos, según entiendo tu planteamiento, pues no puede hacerse.


Supongamos que tenemos la superclase A
De esta heredan dos hijas B y C

Pues si en el main implementamos un objeto de la clase B, tendremos disponibles los atributos y métodos de la clase B y de la clase A(por herencia)

Pero es imposible que tengamos además los atributos y métodos de un objeto de la clase C
¿Cómo vamos a tenerlos si no instanciamos un objeto de dicha clase?

A no ser que los declarasemos como estáticos..., pero entonces esos atributos/métodos ya no pertenecerían a los objetos, si no a la propia clase.


Quizás sería conveniente que publicases el enunciado completo de ese ejercicio, a ver si es que no estás interpretando bien lo que están solicitando.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

drate

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 24
    • Ver Perfil
Re: Herencia Java
« Respuesta #3 en: 10 de Febrero 2023, 16:34 »
Buenas.
Adjunto el ejercicio pues puede que no lo esté entendiendo del todo bien.

Desarrollar un programa que modele una cuenta bancaria que tiene los siguientes atributos, que deben ser de acceso protegido:
• Saldo, de tipo float.
• Número de ingresos con valor inicial cero, de tipo int.
• Número de retiros con valor inicial cero, de tipo int.
• Tasa anual (porcentaje), de tipo float.
• Comisión mensual con valor inicial cero, de tipo float.
La clase Cuenta tiene un constructor que inicializa los atributos saldo y tasa anual con valores pasados como parámetros. La clase
Cuenta tiene los siguientes métodos:
• Ingresar una cantidad de dinero en la cuenta actualizando su saldo.
• Retirar una cantidad de dinero en la cuenta actualizando su saldo. El valor a retirar no debe superar el saldo.
• Calcular el interés mensual de la cuenta y actualiza el saldo correspondiente.
• Extracto mensual: actualiza el saldo restándole la comisión mensual y calculando el interés mensual correspondiente (invoca el
método anterior).
• Imprimir: muestra en pantalla los valores de los atributos.
---------------------------------------------------------------------------------------------------
La clase Cuenta tiene dos clases hijas:
• Cuenta de ahorros: posee un atributo para determinar si la cuenta de ahorros está activa (tipo boolean). Si el saldo es menor a
100€, la cuenta está inactiva, en caso contrario se considera activa. Los siguientes métodos se redefinen:
1. Ingresar: se puede ingresar dinero si la cuenta está activa. Debe invocar al método heredado.
2. Retirar: es posible retirar dinero si la cuenta está activa. Debe invocar al método heredado.
3. Extracto mensual: si el número de retiros es mayor que 4, por cada retiro adicional, se cobra 1.5€ como comisión
mensual. Al generar el extracto, se determina si la cuenta está activa o no con el saldo.
4. Un nuevo método imprimir que muestra en pantalla el saldo de la cuenta, la comisión mensual y el número de
transacciones realizadas (suma de cantidad de consignaciones y retiros).
--------------------------------------------------------------------------------------------------
Cuenta corriente: posee un atributo de sobregiro, el cual se inicializa en cero. Se redefinen los siguientes métodos:
• Retirar: se retira dinero de la cuenta actualizando su saldo. Se puede retirar dinero superior al saldo. El dinero que se debe
queda como sobregiro.
• Ingresar: invoca al método heredado. Si hay sobregiro, la cantidad consignada reduce el sobregiro.
• Extracto mensual: invoca al método heredado.
• Un nuevo método imprimir que muestra en pantalla el saldo de la cuenta, la comisión mensual, el número de
transacciones realizadas (suma de cantidad de consignaciones y retiros) y el valor de sobregiro.
Realizar un método main que implemente un objeto Cuenta de ahorros y llame a los métodos correspondientes
Directrices generales:
1. Guardaremos el archivo para su entrega con el siguiente formato: M1_13_Nombre_Apellid

Muchas gracias. Un saludo.

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 989
    • Ver Perfil
Re: Herencia Java
« Respuesta #4 en: 11 de Febrero 2023, 01:46 »
Ok.
Vayamos por partes:
Citar
Desarrollar un programa que modele una cuenta bancaria que tiene los siguientes atributos, que deben ser de acceso protegido:
• Saldo, de tipo float.
• Número de ingresos con valor inicial cero, de tipo int.
• Número de retiros con valor inicial cero, de tipo int.
• Tasa anual (porcentaje), de tipo float.
• Comisión mensual con valor inicial cero, de tipo float.
La clase Cuenta tiene un constructor que inicializa los atributos saldo y tasa anual con valores pasados como parámetros. La clase
Cuenta tiene los siguientes métodos:
• Ingresar una cantidad de dinero en la cuenta actualizando su saldo.
• Retirar una cantidad de dinero en la cuenta actualizando su saldo. El valor a retirar no debe superar el saldo.
• Calcular el interés mensual de la cuenta y actualiza el saldo correspondiente.
• Extracto mensual: actualiza el saldo restándole la comisión mensual y calculando el interés mensual correspondiente (invoca el
método anterior).
• Imprimir: muestra en pantalla los valores de los atributos.

Esta sería la clase Cuenta, los métodos para calcular el interes mensual y el extracto mensual los he dejado vacíos porque la verdad no me queda claro como se supone que ha de calcularse con un atributo que se llama tasa "anual". Por otro lado, es algo irrelevante, ya que aquí lo que importa es practicar herencias de clases.

Código: [Seleccionar]
public class Cuenta {

protected float saldo;
protected int numIngresos;
protected int numRetiros;
protected float tasaAnual;
protected float comiMensual;

public Cuenta(float saldo, float tasaAnual) {
this.saldo = saldo;
this.tasaAnual = tasaAnual;
numIngresos = 0;
numRetiros = 0;
comiMensual = 0;
}

public void ingresar(float cantidad) {
saldo += cantidad;
numIngresos++;
System.out.println("Ingreso realizado");
}

public void retirar(float cantidad) {
if (cantidad > saldo)
System.out.println("No hay fondos para cubrir la retirada");
else {
saldo -= cantidad;
numRetiros++;
System.out.println("Retiro realizado");
}
}

public void calcularInteresMensual() {

}

public void extractoMensual() {

}

public void imprimir() {
System.out.printf("\nSaldo: %.2f\n", saldo);
System.out.println("Numero Ingresos: " + numIngresos);
System.out.println("Numero Retiros: " + numRetiros);
System.out.printf("Tasa Anual: %.2f%%\n", tasaAnual);
System.out.printf("Comision Mensual: %.2f\n\n", comiMensual);
}

}

Siguiente:
Citar
Cuenta de ahorros: posee un atributo para determinar si la cuenta de ahorros está activa (tipo boolean). Si el saldo es menor a
100€, la cuenta está inactiva, en caso contrario se considera activa. Los siguientes métodos se redefinen:
1. Ingresar: se puede ingresar dinero si la cuenta está activa. Debe invocar al método heredado.
2. Retirar: es posible retirar dinero si la cuenta está activa. Debe invocar al método heredado.
3. Extracto mensual: si el número de retiros es mayor que 4, por cada retiro adicional, se cobra 1.5€ como comisión
mensual. Al generar el extracto, se determina si la cuenta está activa o no con el saldo.
4. Un nuevo método imprimir que muestra en pantalla el saldo de la cuenta, la comisión mensual y el número de
transacciones realizadas (suma de cantidad de consignaciones y retiros).

Pues esta es la clase CuentaAhorros, añadiendo nuevo atributo y sobre escribiendo los métodos según se pide:
Código: [Seleccionar]
public class CuentaAhorros extends Cuenta {

private boolean esActiva;

public CuentaAhorros(float saldo, float tasaAnual) {
super(saldo, tasaAnual);
esActiva = saldo >= 100;
}

@Override
public void ingresar(float cantidad) {
if (esActiva)
super.ingresar(cantidad);
else
System.out.println("Ingreso no es posible. Cuenta inactiva");
}

@Override
public void retirar(float cantidad) {
if (esActiva) {
super.retirar(cantidad);
esActiva = saldo >= 100; //Tras retirar puede quedar inactiva
}
else
System.out.println("Retiro no es posible. Cuenta inactiva");
}

@Override
public void extractoMensual() {

}

@Override
public void imprimir() {
System.out.printf("\nSaldo: %.2f\n", saldo);
System.out.printf("Comision Mensual: %.2f\n", comiMensual);
System.out.println("Total Transacciones: " + (numIngresos + numRetiros) + "\n");
}

}

Siguiente:
Citar
Cuenta corriente: posee un atributo de sobregiro, el cual se inicializa en cero. Se redefinen los siguientes métodos:
• Retirar: se retira dinero de la cuenta actualizando su saldo. Se puede retirar dinero superior al saldo. El dinero que se debe
queda como sobregiro.
• Ingresar: invoca al método heredado. Si hay sobregiro, la cantidad consignada reduce el sobregiro.
• Extracto mensual: invoca al método heredado.
• Un nuevo método imprimir que muestra en pantalla el saldo de la cuenta, la comisión mensual, el número de
transacciones realizadas (suma de cantidad de consignaciones y retiros) y el valor de sobregiro.

Pues clase CuentaCorriente:
Código: [Seleccionar]
public class CuentaCorriente extends Cuenta {

private float sobreGiro;

public CuentaCorriente(float saldo, float tasaAnual) {
super(saldo, tasaAnual);
sobreGiro = 0;
}

@Override
public void retirar(float cantidad) {
saldo -= cantidad;
if (saldo < 0) {
sobreGiro = saldo;
saldo = 0;
}
System.out.println("Retiro realizado");
}

@Override
public void ingresar(float cantidad) {
//¿Hay sobregiro?
if (sobreGiro < 0) { //Sí lo hay
sobreGiro += cantidad;
/*
* Si ahora sobreGiro tiene ahora valor positivo
* es que ha quedado cancelado (vuelve a 0)
* y la cantidad positiva es la que se ingresa al saldo
*/
if (sobreGiro > 0) {
super.ingresar(sobreGiro);
sobreGiro = 0; //Vuelve a 0
}
else
System.out.println("Ingreso realizado");
}
else //No hay sobregiro
super.ingresar(cantidad);
}

@Override
public void imprimir() {
System.out.printf("\nSaldo: %.2f\n", saldo);
System.out.printf("Comision Mensual: %.2f\n", comiMensual);
System.out.println("Total Transacciones: " + (numIngresos + numRetiros));
System.out.printf("Sobregiro: %.2f\n\n", sobreGiro);
}

}

Por último:
Citar
Realizar un método main que implemente un objeto Cuenta de ahorros y llame a los métodos correspondientes

Aquí un main, donde llamo a los métodos básicos para comprobar que se puede retirar y operar con la cuenta, hasta que se queda inactiva por la cantidad de saldo.
No llamo a los métodos que no he sabido escribir.
Código: [Seleccionar]
public class Main {

public static void main(String[] args) {
CuentaAhorros ahorros = new CuentaAhorros(2300, 2.6f);

ahorros.imprimir();
ahorros.retirar(2200);
ahorros.imprimir();
ahorros.retirar(100);
ahorros.imprimir();
ahorros.ingresar(1500);

}

}

Bueno, a parte de esos cálculos que no he entendido como hacer, en lo que respecta a la herencia no ha habido ningún problema.

Para el "main" nos piden crear un objeto de clase CuentaAhorros, que hereda de Cuenta.

No necesitas nada de la otra clase CuentaCorriente para cumplir con el enunciado.

Ya que la has escrito, puedes crear también un objeto de esa clase y comprobar que funciona. Pero el enunciado no lo exige.
Te han pedido que la escribas, pero no que la pongas a prueba.

Quizás esto es lo que te estaba confundiendo, que te hayan hecho crear algo para luego no probarlo...  ??? ...y quizás pensaste que en realidad sí debías probarla, pero solo a través de una de la clases hijas.
Lo cuál es imposible, como ya comenté antes.

Según el enunciado, no es necesario comprobar la clase CuentaCorriente.
Puedes hacerlo si quieres, pero tendrás que crear un segundo objeto que pertenezca a dicha clase.

Espero que se hayan aclarados tus dudas.
Un saludo.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".