[Actualizado] Ayuda código Java

Iniciado por framled, 12 Octubre 2011, 23:12 PM

0 Miembros y 2 Visitantes están viendo este tema.

framled

Hola a todos...
Tengo un gran problema acerca de este código de la clase "Cuadrado" que se detalla mas adelante...

Código (java) [Seleccionar]
//Clase cuadrado...
public class Cuadrado extends Pieza{
private Bloque[] bloque;
public Cuadrado(double [] center, Color color){
       super(center,color);
       this.bloque = new Bloque[4];
       for(int i = 0 ; i<4 ; i++){
           this.bloque[i] = new Bloque(center,color);
           if(i==1){center[0]++ ;center[1]--;}else{center[1]++;}
       }
   }
}


Hay algo malo en eso??
por favor estoy estudiando para cuando vuelva a clases me valla bien y necesito de su ayuda

Valkyr

Revisate toda la teoría que tengas, sobre todo los conceptos de herencia. Estás haciendo uso de super de una manera terrible.

Saludos.

framled

aaaaaaaaaaaaaaaaaaaaaaaaaaa siiiiii eso me temiaaa.... mis bases no son muy buenas y estoy practicando haciendo este tipo de clases xD...

algunos consejos???

framled

Me podrian ayudar con el codigo.... q no entiendo en que me equivoque, por mas que leo la teoria

serai de gran ayuda gracias...


Valkyr

Viendo que has actualizado el código, ¿a que te refieres con que si está mal? ¿No te da el resultado esperado? ¿Cuál es el resultado que esperas que te de?

framled

#6
Cita de: Valkyr en 15 Octubre 2011, 16:05 PM
Viendo que has actualizado el código, ¿a que te refieres con que si está mal? ¿No te da el resultado esperado? ¿Cuál es el resultado que esperas que te de?

si esta mal escrito me refiero a que aun me da el mismo error anterior (cada bloque tenia como centro el mismo centro que el bloque[3];)
quiero que cada bloque tenga un centro de:
bloque[0] = {4.5 , 13.5}
bloque[1] = {4.5 , 14.5}
bloque[2] = {5.5 , 13.5}
bloque[3] = {5.5 , 14.5}

Cita de: SXF en 15 Octubre 2011, 10:36 AM
http://www.programacion.com/articulo/tutorjava_nivel_basico_97/21

gracias por los pauntes

Valkyr

El error se llama "Aliasing".

En Java todo lo que le pasas a una función como parametro, lo que se pasa realmente es el identificador de objeto (su referencia en memoria, por decirlo de alguna forma), por tanto las modificaciones que realices sobre dicho objeto se verán reflejadas fuera.

Es decir, aunque no hicieses esta modificación:
Código (java) [Seleccionar]
if(i==1){center[0]++ ;center[1]--;}else{center[1]++;} todos tus objetos seguirían teniendo el mismo centro.

¿Cuál puede ser la solución? Realizar una copia del array y asignarle al centro la copia, o crear un array nuevo y ponerle los distintos valores.

Te recomiendo que te leas muchos muchos muchos apuntes, si no dominas estas cosas tan básicas, estás perdido en Java.

Saludos.

framled

#8
Cita de: Valkyr en 15 Octubre 2011, 23:38 PM
¿Cuál puede ser la solución? Realizar una copia del array y asignarle al centro la copia, o crear un array nuevo y ponerle los distintos valores.

Te refieres a algo como esto??:

Código (java) [Seleccionar]
//Clase cuadrado...
public class Cuadrado extends Pieza{
private Bloque[] bloque;
public Cuadrado(double [] center, Color color){
       super(center,color);
       this.bloque = new Bloque[4];
       Bloque bloq = new Bloque[4];
       for(int i = 0 ; i<4 ; i++){
           bloq[i] = new Bloque(center,color);
           if(i==1){center[0]++ ;center[1]--;}else{center[1]++;}
       }
       this.bloque = bloq;
   }
}
}


es el mismo error...
Gracias SALUDOS

Valkyr

No, no me refiero a eso, me refiero a algo así:
Código (java) [Seleccionar]

public void metodo(double[] centro){
    //Suponiendo que centro solo tiene dos posiciones:
    double[] nuevo = new double[2];
    nuevo[0] = centro[0];
    nuevo[1] = centro[1];
    bloque = new Bloque(nuevo, color);
}


algo así me refiero. Tienes que realizar una copia del array, porque me imagino que al hacer estas dos llamadas:
Código (java) [Seleccionar]
super(center,color);
bloq[i] = new Bloque(center,color);


dentro del código de cada constructor estarás haciendo algo así:
Código (java) [Seleccionar]
this.centro = center //<-Aliasing

En resumen, tienes que hacer una copia del array si quieres tener centros distintos e independientes.

Y te vuelvo a repetir, leete mucha más teoría. La práctica es necesaria, pero la teoría es mucho más importante.

Saludos.