Java - Override metodo heredado?

 
Vista:
sin imagen de perfil
Val: 33
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

Override metodo heredado?

Publicado por frank (15 intervenciones) el 22/08/2019 06:50:53
Buenas, estoy aprendiendo el tema de las herencias y he hecho un ejercicio del libro que me gustaría con una salida distinta.

Tengo dos clases, una padre y una hija, la padre tiene un metodo toString sobreescrito que dice :
1
2
3
4
@Override
public String toString(){
    return ancho + "x" + alto + "x" + fondo + " " + unid.toString() + "\n"+ "etiqueta: " + etiqueta ;
}

esa variable etiqueta, en en esa clase (clase Caja) es un atributo de tipo String, en la segunda clase
es un atributo de tipo int y esta declarado como tal.
El tema es que tengo este método en la clase cajaCarton:

1
2
3
4
5
6
public String toString(){
    String result = "Cartón total " + cartonTotal + "cm2\n";
    result += "Área: " + area + "cm2\n";
    result += super.toString();
    return result;
}
ese super.toString me devuelve la etiqueta de la superclase, no la de la heredada y me sale null por consola.
Quizás me lo explica más adelante en el libro, no lo se, pero no me gusta el outcome del programa tal que así.
Hay alguna forma cambiar eso?
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

Override metodo heredado?

Publicado por Kabuto (1381 intervenciones) el 22/08/2019 11:01:51
Hummm...

Yo aquí lo que veo inconsistente es que si la clase padre ya tiene el atributo "etiqueta", no tiene sentido que la clase hija también lo tenga, y encima con un tipo de dato distinto, int en lugar de String.

Lo lógico sería que la clase hija use el atributo etiqueta del padre, no debería tener también el mismo atributo. A no ser que aunque se llamen igual, representan cosas distintas.
Pero vamos, una etiqueta es una etiqueta...

En mi opinión y basándome en la info que nos das, la corrección correcta sería suprimir el atributo etiqueta de la clase hija, ya que es redundante puesto que el padre ya la tiene.

Ahora bien, si no quieres modificar las clases por seguir respetando lo estipulado en el libro ese, para conseguir evitar que te salga null al invocar el toString lo que puedes hacer es transferir el valor del atributo etiqueta de la clase hija, al atributo del padre.
Así ya no tiene valor null cuando salga el dato en pantalla.

Suponiendo que la clase padre tenga un método set para el atributo etiqueta, y teniendo en cuenta que hay que hacer una conversión de datos ya que uno es int y el otro es un String..

Puedes intentar hacer algo similar a esto:

1
2
3
4
5
6
7
public String toString(){
    String result = "Cartón total " + cartonTotal + "cm2\n";
    result += "Área: " + area + "cm2\n";
    super.setEtiqueta(Integer.toString(this.etiqueta));  //Transferimos valor de etiqueta a clase padre
    result += super.toString();
    return result;
}
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: 33
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

Override metodo heredado?

Publicado por frank (15 intervenciones) el 22/08/2019 11:55:12
Te paso el ejercicio para que lo entiendas.

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/*
Las empresas de transportes, para evitar daños en los paquetes, embalan todas sus mercancias en cajas
con el tamaño adecuado. Una caja se crea expresamente con un ancho, un alto y un fondo y,
una vez creada, se mantiene inmutable. Cada caja lleva pegada una etiqueta con información
útil como el nombre del destinatario, dirección, etc. Se pide implementar la clase Caja con los métodos.

*Caja(int ancho, int alto, int fondo, Unidades u): 
que construye una caja con las dimensiones especificadas, que pueden encontrarse en "cm" o
"m"

* double getVolumen(): que devuelve el volumen de la caja en metros cuadrados.

* String toString(): que devuelva una cadena con la representacion de la caja.
*/
 
/*
MAIN
      Caja a, b;
      a = new Caja(100,200,200,Caja.Unidad.CM);
      a.etiqueta = "Antonio Perez \n Calle Larga n 8";
      b = new Caja(1.2, 0.9, 1.45, Caja.Unidad.M);
      b.etiqueta = "pepa gonzales. Entregar antes de las 10:00h";
      
        System.out.println(a);
        System.out.println("Volumen: " + a.getVolumen());
        System.out.println(b);
        System.out.println("Volumen: " + b.getVolumen());
*/
 
 
public class Caja {
 
    public enum Unidad {CM, M}
 
    protected final double ancho, alto, fondo;
    protected final Unidad unid;
    protected double volumen;
    public String etiqueta;
 
    public Caja(double ancho, double alto, double fondo, Unidad unid){
        this.ancho = ancho;
        this.alto = alto;
        this.fondo = fondo;
        this.unid = unid;
 
        switch ( unid){
            case CM:
 
                volumen = (ancho / 100) * (alto / 100) * (fondo/100);
                break;
 
            case M:
                volumen = ancho * alto * fondo;
                break;
        }
    }
 
    public double getVolumen(){
        return volumen;
    }
 
    @Override
    public String toString(){
        return ancho + "x" + alto + "x" + fondo + " " + unid.toString() + "\n"+ "etiqueta: " + etiqueta ;
    }


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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/*
La empresa de mensajería BiciExpress que reparte en bicicleta, para disminuir el peso a 
transportar por sus empleados solo utiliza cajas de cartón. Por motivos de privacidad, las 
etiquetas (con texto) que se pegan en las cajas normales se sustituyen por una
etiqueta con un número (que determina el cliente, la dirección del envío, etc). Además las
cajas de cartón se caracterizan porque su volumen se calcula como el 80% del volumen
real, ya que si las cajas se llenan mucho, se deforman y se rompen. Otra característica
de las cajas de cartón es que sus medidas siempre están en centímetros.
Por último, la empresa, para controlar costes, necesita saber cuál es la superficie total
de cartón utilizado para construir todas las cajas enviadas. Se pide implementar a partir
de la clase Caja, la clase CajaCarton.
*/
 
/*
Una caja de cartón no es más que una caja, con algunas caracterísitcas, como:
* las cajas de cartón utilizan como unidad estandar el cm.
*Es necesario controlar (guardar) el área de la superficie de la caja
* Y tenemos que acumular, para todas las cajas de cartón, el cartón total utilizado
*/
 
 
/*
MAIN
   Caja a = new CajaCarton(100,200,200);
        a.etiqueta = "Dirección de envio";
        System.out.println(a);
        System.out.println("Volumen: " +a.getVolumen());
        
        CajaCarton b = new CajaCarton(50.6, 75.5 , 100);
        b.etiqueta = 23;
        System.out.println(b.etiqueta);
        System.out.println(b);
        System.out.println("Volumen: " +b.getVolumen());
*/
 
public class CajaCarton extends Caja{
 
 
    static double cartonTotal = 0;
    protected double area;
 
    int etiqueta;
 
    CajaCarton(double ancho, double alto,double fondo){
        super(ancho, alto, fondo, CajaCarton.Unidad.CM);
        area = 2 * (ancho *alto + ancho * fondo + alto * fondo);
        cartonTotal += area;
    }
 
    double getArea(){
        return area;
    }
 
    @Override
    public double getVolumen(){
        // Aunque el volumen de una caja de cartón coincida con el volumen de una caja,
        // en la practica, para evitar roturas, se calcula el volumen "práctico" como un
        // 80% del volumen real:
        return volumen * 0.8;
    }
 
    @Override
 
public String toString(){
        String result = "Cartón total " + cartonTotal + "cm2\n";
        result += "Área: " + area + "cm2\n";
        result += super.toString();
        return result;
    }


En el codigo de la clase CajaCarton tienes el main, vas a ver cuando lo ejecutes que sale null, el problema es ese, que hereda del toString de la clase Caja, igualmente, no me interesa arreglarlo más que comprenderlo, podría hacer un if y solo mostrarlo si tiene algo o cualquier chorrada pero si el código fuera amplio y esa variable la usara para cualquier tontería me podría dar problemas.
Gracias
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: 33
Ha aumentado 1 puesto en Java (en relación al último mes)
Gráfica de Java

Override metodo heredado?

Publicado por frank (15 intervenciones) el 22/08/2019 12:18:20
bueno, he puesto esto en el toString de cajacarton

super.etiqueta = String.valueOf(this.etiqueta);

hace lo que quiero, además he probado con un objeto caja después y sin meterle la etiqueta sale null, así que ya entiendo un poquillo más como va eso, muchas gracias por la respuesta kabuto.
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