Autor Tema: Ejercicio CU00686B extends y super  (Leído 8180 veces)

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Ejercicio CU00686B extends y super
« en: 05 de Agosto 2014, 09:06 »
Hola
En un archivo adjunto (ParaEnviar.rar) envío 6 clases del ejercicio +  2 clases accesorias con métodos estáticos.
Me daba error (demasiado texto para enviar) en esta ventana.

Clases:
Producto
ProductoFresco
ProductoRefrigerado
ProductoCongelado
ListaDeProductos
TestHerencia2  con main

Clases accesorias:
Validador
Mensa

Nota: En la clase ListaDeProductos hay un método convertido a comentario llamado public void muestraLista(String tipoProducto) que he sustituido por el public void muestraLista(int valor)
Este segundo método funcional recibe un entero que en un switch dirige el código
En el primer método que me daba errores, quería hacer lo mismo, pero nada, por muchas vueltas que le he dado no he sabido deshacer el entuerto.

¿Podeis hecharle un vistazo?
Y decirme, donde está la chinita o el predrusco si es el caso. :-[

Gracias

dongo

  • Intermedio
  • ***
  • Mensajes: 177
    • Ver Perfil
Re:Ejercicio CU00686B extends y super
« Respuesta #1 en: 05 de Agosto 2014, 12:09 »
Hola, he estado repasando tus ficheros y en lo único que me da problemas, es en la declaración del package al que pertenecen las clases, aparte de un - que me aparece al principio de todas, no se a que sera debido ese guión.

Añade a los ficheros una clausula al inicio que indique a que paquete pertenecen...Fijate también que los imports van de acuerdo al paquete al que pertenecen las clases.

Código: [Seleccionar]
package nombre_paquete;
....
imports
....
resto de la clase

Te adjunto una captura de como quedaría una de las clases.


Por lo demás, he estado probando ejecutando el TestHerencia2 y parece que funciona bien. te mando una captura de la ejecución para que veas...

La verdad que no lo he probado a fondo pero parece funcionar, intenta arreglar eso que te comento de los packages y ya nos cuentas.

Te adjunto también las clases modificadas, pero claro esto esta de acuerdo al paquete que yo he creado(ejemplo_herencia). No se que IDE usarás, pero tendrás que crear un paquete  y meter todas las clases dentro de ese paquete.


Nota de edición:

Por cierto cuando llamas a un metodo de la clase padre como en este caso

Código: [Seleccionar]
public void mostrarInformacionPFresco () {
        mostrarInformacionDelProducto();
        System.out.println ("FECHA DE ENVASADO: " + fechaEnvasado +
            "\tPAIS DE ORIGEN: " + paisOrigen);
    }

Al método de la clase padre se le suele llamar con la clausula super delante, de la siguiente manera:
 
Código: [Seleccionar]
public void mostrarInformacionPFresco () {
        super.mostrarInformacionDelProducto();
        System.out.println ("FECHA DE ENVASADO: " + fechaEnvasado +
            "\tPAIS DE ORIGEN: " + paisOrigen);
    }

Esto mas que nada para evitar problemas y para saber que ese método proviene de la clase de la que hereda.
« Última modificación: 05 de Agosto 2014, 12:41 por dongo »

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Re:Ejercicio CU00686B extends y super
« Respuesta #2 en: 05 de Agosto 2014, 16:28 »
Hola dongo
Lo del package que te da problemas, es culpa mía. :-[

Te cuento. Yo tengo mis clases en mi package del ejercicio CU00... y en un package aparte las que yo llamo clases accesorias que importo según las necesito

En un ejercicio anterior, el de los packages, envié varias clases en sus packages según pedía el ejercicio. Como a la hora de comprobar desde el foro que esas clases estaban bien formateadas en su package había que crear todos esos packages, se quedó que en ejercicios posteriores, todas las clases estarían en el package por defecto (todos en la misma carpeta).
Para hacerlo así, cada vez que envío clases al foro, elimino en la misma ventana del mensaje/asunto la cabecera de la clase que incluye el package, así, cuando descarga alguien las clases, todas están en el package por defecto.

Continúo.
Como esta vez por la extensión del código, no me dejaba enviarlo como mensaje, opté por enviar el código en un archivo adjunto.
Yo tomé cuiado de eliminar la cabecera de las clases con su package. Eso lo hice con el bloc de notas de windows. Y aquí no se si al tener Bluej (por cierto mi IDE es Bluej) abierto, detectaba que perdía la referencia del package y la volvía a escribir, o no se que cosa pasa.
Comprueba, yo lo he hecho, que dentro del archivo comprimido que envié, todos los archivos empiezan con los comentarios, no aparece ningún package.

Lo del guión que comentas, supongo que debe ser un caracter especial que habrá metido el bloc de notas o Bluej, no sé, que al igual que el tabulador empuja el cursor varios espacios adelante, este lo que hace el saltar al principio de línea (sin cambiar de línea) y continuar escribiendo a partir de allí. ???

Resumiendo. Si pones todas las clases en la misma carpeta/package y eliminas el package incorrecto que aparece, todo debe ir bien.
Aunque como me has demostrado con tu respuesta, eso lo has solucionado por tu cuenta.

Si otra vez debo enviar las clases por un adjunto, dejaré que todas tengan el mismo package y así funcionará sin hacer demasiados cambios. ¿Estoy en lo cierto?

Me quedo con la nota de: las llamadas a los métodos de la clase padre precederlas de 'super'. Y así el compilador no tiene que hacer suposiciones, al igual que con 'this'

Gracias por tu respuesta, extensa y surtida con imágenes.  :)

Quiero aprovechar para pedirte le eches un ojo al método que tengo convertido en comentario en la clase ListaDeProductos
public void muestraLista(String tipoProducto)
si funcionara bien tendría que ir donde aparece el siguiente código del main entre las líneas 70-74

           if (respuesta3.equals("1")) {      listaProductos.muestraLista(1);   }
                else if (respuesta3.equals("2")) { listaProductos.muestraLista(2);   }
                else if (respuesta3.equals("3")) { listaProductos.muestraLista(3);   }

     
y en su lugar pondría

           if (respuesta3.equals("1")) {      listaProductos.muestraLista("ProductoFresco");   }
                else if (respuesta3.equals("2")) { listaProductos.muestraLista("ProductoRefrigerado");   }
                else if (respuesta3.equals("3")) { listaProductos.muestraLista("ProductoCongelado");   }

     
Como decía en el primer mensaje, tengo un método sustituto.
Pero tenía interés en saber si este método hace algo incongruente, que debe hacerlo pues da error. Y saber donde está el tapón que bloquea este método.

Gracias otra vez.

dongo

  • Intermedio
  • ***
  • Mensajes: 177
    • Ver Perfil
Re:Ejercicio CU00686B extends y super
« Respuesta #3 en: 05 de Agosto 2014, 17:33 »
AAAAAAA va va vaa pensé que el proyectiyo en si tenia un error al que no le dabas con el conke.... y el conke esta en el método comentado XDD, jajaja se me fue la perola, sorry.

Bueno a ver te intentare guiar para que tu solo te des cuenta de la respuesta:

Fijate en el metodo muestraLista(String tipoProducto):

Código: [Seleccionar]
public void muestraLista(String tipoProducto) { // muestra por tipo de producto
         Iterator <Producto> itP = listaDeProductos.iterator();
         Producto tmpP;
         int contador = 0;
         while (itP.hasNext()) {
             tmpP = itP.next();
             contador = contador++;
             System.out.println (tipoProducto + " tmpP.getClass().toString().contains(tipoProducto) " +
                 tmpP.getClass().toString().contains(tipoProducto));
             if (tmpP.getClass().toString().contains(tipoProducto)) {
                 ProductoFresco tmpF = (ProductoFresco) tmpP;
                 System.out.println ("\nNum: " + contador + " Producto fresco.");
                 tmpF.mostrarInformacionPFresco();
             } else if (tmpP.getClass().toString().contains(tipoProducto)) {
                 ProductoRefrigerado tmpR = (ProductoRefrigerado) tmpP;
                 System.out.println ("\nNum: " + contador + " Producto refrigerado.");
                 tmpR.mostrarInformacionPRefrigerado();
             } else if (tmpP.getClass().toString().contains(tipoProducto)) {
                 ProductoCongelado tmpC = (ProductoCongelado) tmpP;
                 System.out.println ("\nNum: " + contador + " Producto congelado.");
                 tmpC.mostrarInformacionPCongelado();
            }
        }
     }

Fíjate en las tres condiciones, no ves algo raro??? ajajaja a ver dividamos el método en trozos y cogamos una de las condiciones:

Código: [Seleccionar]
if (tmpP.getClass().toString().contains(tipoProducto)) {
                 ProductoFresco tmpF = (ProductoFresco) tmpP;
                 System.out.println ("\nNum: " + contador + " Producto fresco.");
                 tmpF.mostrarInformacionPFresco();
             }

A ver, ese if que tu has creado lo has creado con la intención de que cuando el elemento de la lista sea un producto fresco entre en ese if.

Ahora vamonos al siguiente, en este caso else if, Si te fijas, la condición es exactamente la misma que la del primer if, por lo tanto en lugar de entrar en el else if que le correspondía, a entrado en el primer if, porque claro, el nombre de la clase claro que se corresponde con el que viene por el parámetro,  entonces en lugar de entrar en el else if, a entrado en el if, y lo que esta haciendo es intentar convertir un producto  refrigerado a un producto fresco.

Con lo cual solo debes buscas una manera de diferenciar cuando va a ser un "ProductoFresco", cuando uno "ProductoRefrigerado" y cuando un "ProductoCongelado".

La solución es muy simple, pero es complicado de explicar, intenta analizar lo que te he escrito y echale un ojo a ver si lo arreglas, sino lo consigues, escribenos y te digo sdonde esta el conque... jajaja

Y por cierto para comentarios de mas de una linea, usa /*    */ , que no veas pa borrar los comentarios del método XDD

Bueno un saludo y a e si le da con la tecla.



toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Re:Ejercicio CU00686B extends y super
« Respuesta #4 en: 05 de Agosto 2014, 21:51 »
Si dongo
Ahora lo he visto claro.
El parámetro 'tipoProducto' que pongo dentro de la condición del if siempre tendrá el mismo valor para cada una de las condiciones del if else if
if (tmpP.getClass().toString().contains(tipoProducto))

Si acierta coincidir el parámetro con la primera condición, vale, funciona bien.
Pero si no coincide intenta hacer una conversión que no procede, y da el error

Viéndolo de otra manera, o tal vez también lo ves tu así.
Las tres condiciones del if buscan la coincidencia con la misma cadena 'tipoProducto'
Una puede ser cierta, las otras dos no.

Necesitaba que alguien me lo señalara desde fuera, yo no sabia verlo, estaba emperrado en que tenía que funcionar.

Gracias por señalarmelo en tu cita
Citar
Ahora vamonos al siguiente, en este caso else if, Si te fijas, la condición es exactamente la misma que la del primer if, por lo tanto en lugar de entrar en el else if que le correspondía, a entrado en el primer if, porque claro, el nombre de la clase claro que se corresponde con el que viene por el parámetro,  entonces en lugar de entrar en el else if, a entrado en el if, y lo que esta haciendo es intentar convertir un producto  refrigerado a un producto fresco.

Respecto a lo de los comentarios, en Bluej las teclas F8 y F7 ponen y quitan el comentario de doble barra. Para mi es muy cómodo.
Para varias líneas, las selecciono y pulso F7 o F8
Y para una línea pongo el cursor en la línea (no hace falta seleccionar) y pulso la tecla de función

Yo he buscado un automatismo (como la pulsación de teclas de función) para el comentario \* y no lo he encontrado.
Si alguien lo conoce no tengo inconveniente en cambiar una forma por otra de hacer comentarios.

Saludos

dongo

  • Intermedio
  • ***
  • Mensajes: 177
    • Ver Perfil
Re:Ejercicio CU00686B extends y super
« Respuesta #5 en: 05 de Agosto 2014, 22:42 »
estupendo, bueno, te has dado cuenta, no se si habrás podido arreglarlo, pero te lo paso de manera que funciona... fíjate en las condiciones:

Código: [Seleccionar]
public void muestraLista(String tipoProducto) { // muestra por tipo de producto
        Iterator <Producto> itP = listaDeProductos.iterator();
        Producto tmpP;
         int contador = 0;
         while (itP.hasNext()) {
             tmpP = itP.next();
             contador = contador++;
            System.out.println(tmpP.getClass().toString());
            if (tmpP.getClass().toString().contains(tipoProducto) && tipoProducto.equals("ProductoFresco")) {
                ProductoFresco tmpF = (ProductoFresco) tmpP;
                 System.out.println ("\nNum: " + contador + " Producto fresco.");
                 tmpF.mostrarInformacionPFresco();
            } else if (tmpP.getClass().toString().contains(tipoProducto) && tipoProducto.equals("ProductoRefrigerado")) {
                ProductoRefrigerado tmpR = (ProductoRefrigerado) tmpP;
                System.out.println ("\nNum: " + contador + " Producto refrigerado.");
               tmpR.mostrarInformacionPRefrigerado();
             } else  if (tmpP.getClass().toString().contains(tipoProducto) && tipoProducto.equals("ProductoCongelado")) {
                 ProductoCongelado tmpC = (ProductoCongelado) tmpP;
                System.out.println ("\nNum: " + contador + " Producto congelado.");
                 tmpC.mostrarInformacionPCongelado();
             }
         }
     }

De esta manera ya estamos diciendo que coincida el nombre de la clase y ademas estamos diferenciando cuando es un productoFresco, uno refrigerado y uno congelado, de esta manera entrara en el bloque if adecuado y se realiza bien las conversiones. Espero que fueras capaz de sacarlo por tu cuenta.

En cuanto a lo del IDE, bueno yo uso netbeans o eclipse, según me de la pica, no me importa uno u otro, eso si, controlo mas netbeans. El blueJ ya se me quedo muy pequeño para mi, por lo que he visto en tus ejercicios, yo creo que ya podrías aventurarte en algún ide mas profesional, pero vamos, que es a preferencia de cada uno.

Se te da bastante bien, el método estaba practicamente echo, solo le falto ese matiz  ;) bueno un saludo!

Edito: Modifico el codigo y en lugar de poner == uso el método equals, que el == es una chapuzilla....XDDD
« Última modificación: 05 de Agosto 2014, 22:58 por dongo »

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Re:Ejercicio CU00686B extends y super
« Respuesta #6 en: 06 de Agosto 2014, 21:18 »
Vaya dongo eres un fiera.
Yo con tu explicación del 'conque' ya me daba por satisfecho, me quitaba la espina del porque no iba eso.
Así pues, estaba abandonando ese código -ya te dije que tenía un método sustituto-.
Pero veo, que como otras veces que me proponen una solución, en este caso la tuya.
De sencilla que es me desarma.
Añadiendo a la condición del if ' && tipoProducto.equals("ProductoFresco")'
Que dicho a la pata llana sería 'Y además que coincida con ProductoFresco'.
Es que tal como lo veo, más secillo sería acompañarlo de la mano.

No hay como disfrutar de la sabuduría de la experiencia (la tuya) para, como digo yo: Conectar las neuronas por el camino más corto.

Respecto al IDE para trabajar con java. He oído mencionar a otros usuarios del foro tanto de Eclipse como de NetBeans. Tú me dices que usas los dos a conveniencia.
Yo, cuando vea o me parezca que Bluej se me queda corto, probaré NetBeans (es una decisión intuitiva, influenciada por el nombre que me parece más moderno que Eclipse), no conozco ni uno ni otro, y no puedo decidir por comparación.

Saludos y gracias por tus aportaciones. :)

dongo

  • Intermedio
  • ***
  • Mensajes: 177
    • Ver Perfil
Re:Ejercicio CU00686B extends y super
« Respuesta #7 en: 06 de Agosto 2014, 21:37 »
Nada Hombre!

Sobre el IDE como tu bien dices cuando notes que se te queda corto, pues cambiarás, la verdad que no conozco bluej, yo empece con eclipse de primeras, aun así tire mas por el netbeans y viene con bastantes plugins de base ademas de un servidor de aplicaciones, etc....

Por ponerte un ejemplo con netbeans y eclipse, tienes una función en que con 3 clicks te crea todos los set y get de tu clase, y no te tienes que pegar un cuarto de hora escribiendo código que es totalmente trivial. Como ya te digo no conozco bluej y no se si tendrá esa función, supongo que si porque es de lo mas básico... pero como esas miles...

Simplemente te lo comente por que ya te veo que lo que es el código básico lo controlas y mientras antes te metas a un IDE profesional antes aprenderás a usarlo, al principio asusta pero te acabas acostumbrando.

No quiero influenciarte, ni desprestigiar bluej, solo es mi humilde opinión y nada sigue trabajando. 

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Ejercicio CU00686B extends y super
« Respuesta #8 en: 06 de Agosto 2014, 23:38 »
Hola, ya que se habla de BlueJ quiero hacer una pequeña aportación. BlueJ se eligió como entorno de desarrollo para el curso java desde cero por varios motivos: es un entorno con fines educativos, tiene muy buenas posibilidades para la didáctica de la programación orientada a objetos, y es ligero comparado con otros ides. Al mismo tiempo, tiene toda la potencia de Java (ni más ni menos que otros ides). Por eso y después de varias discusiones respecto a qué podía ser lo más conveniente se eligió BlueJ. Es cierto que BlueJ en algún momento, si una persona continúa progresando como programador, deberá abandonarse a favor de otros ides con carácter profesional que aportan ciertas potencialidades de las que carece BlueJ. Pero creo que para el aprendizaje es ideal y que casi todo el que haya aprendido con BlueJ quedará agradecido de haber encontrado ese entorno... Saludos.

toni_apr

  • Avanzado
  • ****
  • Mensajes: 497
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Re:Ejercicio CU00686B extends y super
« Respuesta #9 en: 07 de Agosto 2014, 21:31 »
Sí Alex. Tu postura respecto al papel que juega el IDE Bluej en este curso de java, es más que correcta.
No me compete a mí tomar decisiones al respecto. Estoy dando mi opinión fundada en lo que he aprendido en este foro.

A saber, y muy importante.
Bluej dejando a parte las deficiencias que pueda tener, es un entorno donde el que está aprendiendo, puede probar la consistencia del método creado desligándolo de cualquier otro código.
Puede crear objetos (a partir de sus clases) probando que son funcionales al 100% y que no contienen errores.
Ah, me olvidaba. Parece ser que Bluej es el único IDE que permite hacer eso. Otro punto a su favor.

Son dos cosas muy sencillas, pero evitan tener que construir una casa para comprobar si las baldosas son adecuadas para ella.

Otro símil: En Bluej podemos hacer como en la empresa que fabrica componentes.
Una vez creado un componente, pasa al control de calidad donde es modificado, rechazado o aceptado según cada caso.
El componente aceptado se unirá a otros componetes para crear un producto terminado, que a su vez será testeado por el control de calidad para ver que todos ellos interaccionan bien y realizan su cometido.

Para mí, este tema está cerrado y no tiene discusión.

Saludos.

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:Ejercicio CU00686B extends y super
« Respuesta #10 en: 07 de Agosto 2014, 22:04 »
Bueno, cada cual que cierre o que deje los temas abiertos según su parecer. No quiero ponerle medallas a BlueJ ni quitárselas, ni digo que pueda ser mejor o peor que otros ides. Yo por mi parte el tema lo dejo abierto porque cualquier cosa que cierre (y más en programación) la tengo que volver a abrir al cabo de un tiempo así que prefiero no cerrar nada...  ::)

 

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".