Foro de elhacker.net

Programación => Java => Mensaje iniciado por: kikian94 en 11 Marzo 2014, 11:52 am



Título: pasar un objeto a un objeto, es posible??
Publicado por: kikian94 en 11 Marzo 2014, 11:52 am
hola, estoy haciendo un ejercicio de la uni en el que hay que dibujar una serie de rectangulos, tengo tres clases, vector, muro y el main:

vector:
Código
  1. public class Vector {
  2.  
  3.    private final int N;         // length of the vector
  4.    private double[] data;       // array of vector's components
  5.  
  6.    /**
  7.      * create the zero vector of length N
  8.      * @param N Vector length.
  9.      */
  10.    public Vector(int N) {
  11.        this.N = N;
  12.        this.data = new double[N];
  13.    }
  14.  
  15.    /**
  16.      * create a vector from either an array or a vararg list
  17.      * this constructor uses Java's vararg syntax to support
  18.      * a constructor that takes a variable number of arguments, such as
  19.      * Vector x = new Vector(1.0, 2.0, 3.0, 4.0);
  20.      * Vector y = new Vector(5.0, 2.0, 4.0, 1.0);
  21.      * @param data Initial value of the vector.
  22.      */
  23.    public Vector(double... data) {
  24.        N = data.length;
  25.  
  26.        // defensive copy so that client can't alter our copy of data[]
  27.        this.data = new double[N];
  28.        for (int i = 0; i < N; i++)
  29.            this.data[i] = data[i];
  30.    }
  31. //*metodos*/
  32.  

muro:
Código
  1. public class Muro {
  2.  
  3.  
  4. public static final double NO_IMPACTO = 999.0;
  5. protected Vector posicion;
  6. private Vector dimensiones;
  7.  
  8. /**
  9. * Crea un muro.
  10. *
  11. * @param Vector - con las coordenadas del centro del muro.
  12. * @param Vector - con las dimensiones del muro (semianchura, semialtura).
  13. */
  14. public Muro(Vector posicion,Vector dimensiones){
  15. this.posicion = posicion;
  16. this.dimensiones = dimensiones;

main:

Código
  1. import java.awt.*;
  2. public class Main {
  3.  
  4. public static void main(String[] args) {
  5.  
  6.  
  7. Muro muro[5];
  8. int i;
  9. muro[0]= new Muro(0, .5, .005, .5);
  10. muro[1]= new Muro(.5, 1, .505, .005);
  11. muro[2]= new Muro(1, .5, .005, .5);
  12. muro[3]= new Muro(.5, .65, .005, .2);
  13. muro[4]= new Muro(.25, .1, .2, .005);

el caso es que necesito crear 5 muros al inicio del programa pero me dice eclipse que no le puedo pasar esos parametros, que en el constructor no estan declarados, pero si el constructor de muro tiene como parametros 2 vectores y estos a su vez tienen cada uno 2 valores por que no puedo meter 4 valores al constructor? como se le pueden pasar correctamente?


Título: Re: pasar un objeto a un objeto, es posible??
Publicado por: egyware en 11 Marzo 2014, 13:13 pm
Como lo mencionas, los constructores no son Transitivos. No puedes asumir eso.

Generalmente uno lo que hace en esos casos es sobrecargar el constructor, como por ejemplo:
Código
  1. public Muro(double ax, double ay, double bx, double by)
  2. {
  3.   this(new Vector(ax, ay), new Vector(bx, dy));
  4. }
  5.  

Acá aparte que te hecho tu tarea (contra de las reglas) tienes que aprender dos cosas
  • Sobrecarga de funciones
  • Constructores (fíjate en el this que hice, que fue llamar otro constructor de la misma clase)

Saludos


Título: Re: pasar un objeto a un objeto, es posible??
Publicado por: kikian94 en 11 Marzo 2014, 15:32 pm
pero en la clase muro tengo que hacerla con el constructor que me dan es decir, que se le pasen 2 parametros, por que en vez de 2 variables un vector puede tener 3 y el constructor tendria que tener 6 parametros


Título: Re: pasar un objeto a un objeto, es posible??
Publicado por: egyware en 11 Marzo 2014, 15:41 pm
Mi respuesta a tu pregunta ya está respondida.

Fíjate bien el el "this", yo lo que hice fue hacer un constructor más cómodo. Sin embargo perfectamente podías hacer esto.

Código
  1. new Muro(new Vector(0, .5), new Vector(.005, .5));
  2.  

Citar
Observa los ejemplos, modificalos, aprende de ellos. Podrías haber experimentado y sacar conclusiones por ti mismo.


Título: Re: pasar un objeto a un objeto, es posible??
Publicado por: Mitsu en 11 Marzo 2014, 16:22 pm
que se le pasen 2 parametros, por que en vez de 2 variables un vector puede tener 3 y el constructor tendria que tener 6 parametros

Si no tienes en mente un número de valores fijo que puede contener tus Vector, mejor primero guarda los valores que desees en una colección y luego se la pasas al Vector en el constructor de Muro.

No te hagas problemas, se trata de pensar.

Código
  1. // valores para el vector 1
  2. Collection<Double> coleccion1 = new ArrayList<>();
  3. coleccion1.add(0.5);
  4. coleccion1.add(7d);
  5. coleccion1.add(.35);
  6. // valores para el vector 2
  7. Collection<Double> coleccion2 = new ArrayList<>();
  8. coleccion2.add(0.8);
  9. coleccion2.add(4d);
  10. coleccion2.add(.65);
  11.  
  12.                Muro[] muro = new Muro[5];
  13.                muro[0] = new Muro( new Vector<Double>(coleccion1), new Vector<Double>(coleccion2) );
  14.                // el resto


Título: Re: pasar un objeto a un objeto, es posible??
Publicado por: kikian94 en 11 Marzo 2014, 18:41 pm
Mi respuesta a tu pregunta ya está respondida.

Fíjate bien el el "this", yo lo que hice fue hacer un constructor más cómodo. Sin embargo perfectamente podías hacer esto.

Código
  1. new Muro(new Vector(0, .5), new Vector(.005, .5));
  2.  

lo probe y perfecto amigo, muchas gracias, que rapidez a si es genial :)


Título: Re: pasar un objeto a un objeto, es posible??
Publicado por: kikian94 en 12 Marzo 2014, 13:28 pm
quiero utilizar este metodo StdDraw.filledRectangle(double,double,double,double) y tengo que pasarle los 4 parametros definidos previamente en cada objeto muro, como lo hago? asi esta mal, ya que paso la referencia StdDraw.filledRectangle(muro);


Título: Re: pasar un objeto a un objeto, es posible??
Publicado por: egyware en 12 Marzo 2014, 13:45 pm
quiero utilizar este metodo StdDraw.filledRectangle(double,double,double,double) y tengo que pasarle los 4 parametros definidos previamente en cada objeto muro, como lo hago? asi esta mal, ya que paso la referencia StdDraw.filledRectangle(muro);

Claro que está mal, debes acceder a las variables que contiene el muro.
Se nota que tienes que estudiar más, estoy viendo que estás carente de varios conceptos. Pero es normal no todos nacimos sabiendo y a mi tomó mucho tiempo aprender bien java.

Para empezar un objeto en java es la representación de un objeto real o virtual (una silla o el conocimiento de alguien). En tu caso estás representando un muro de solo 2D. El objeto muro tiene propiedades que representan las propiedades físicas del muro, como por ejemplo posición y dimensiones.

Usaré este código para representar lo que digo.
Código
  1. public class Muro
  2. {
  3. public Muro(int _x, int _y,int _w, int _h )
  4. {
  5. x = _x;
  6. y = _y;
  7. w = _w;
  8. h = _h;
  9. }
  10. public int x;
  11. public int y;
  12. public int width;
  13. public int height;
  14. }
  15. Muro muro = new Muro(10,20,40,60);
  16.  

Entonces como el objeto muro representa un muro, podemos aprovecharnos de esas propiedades, para obtener otras cosas como por ejemplo el área, cuanta pintura necesitar, colisiones, etc...
Si deseamos hacer una representación visual (y utilizando el API de dibujado de java) debería hacer algo así.

Código
  1. Graphics g = getGraphics();
  2. g.fillRect(muro.x, muro.y, muro.w, muro.h);
  3.  
Si observas y viendo de una cierta manera Graphics y Muro no se conocen, sin embargo para poder lograr pintar una representación visual del muro tuve que pasarle las propiedades del Muro a Graphics para poder el se encargue de pintar finalmente.

Espero que me hayas entendido y puedas aplicar lo que te intenté enseñar aquí para tu tarea, saludos.

http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics.html#fillRect(int, int, int, int) (http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics.html#fillRect(int, int, int, int))

Citar
“Regala un pescado a un hombre y le darás alimento para un día, enséñale a pescar y lo alimentarás para el resto de su vida.”








Título: Re: pasar un objeto a un objeto, es posible??
Publicado por: kikian94 en 12 Marzo 2014, 15:11 pm
ya, si ya se que esta mal al pasarlo, pero lo que no me queda claro es como recorrer el array muro e ir accediendo a los 4 parametros de cada elemento, han sido declarados asi
Código
  1. new Muro(new Vector(0, .5),new Vector(.005, .5))
que tengo que hacer refernecia al objeto muro y asu vez a vector?


Título: Re: pasar un objeto a un objeto, es posible??
Publicado por: egyware en 12 Marzo 2014, 15:18 pm
Pero fíjate lo que hace el constructor.

Código
  1. public Muro(Vector posicion,Vector dimensiones)
  2. {
  3. this.posicion = posicion;
  4. this.dimensiones = dimensiones;
  5. }
  6.  

Copia los dos vectores pasados como argumentos y los guarda en las propiedades correspondientes del objeto muro.


Título: Re: pasar un objeto a un objeto, es posible??
Publicado por: Mitsu en 12 Marzo 2014, 16:32 pm
Hola, la respuesta de egyware ya te ha dicho todo lo que necesitas para costruir tu algoritmo de manera correcta. Lo que pasa es aún no puedes verlo porque te falta la base de la POO(Programación orientada a objetos). Tienes que estudiar teoria y práctica de conceptos de encapsulamiento, herencia, polimorfismo, interfaces, clases y objetos para que puedas proseguir con Java ya que es un lenguaje orientado a objetos.

Ahora vamos con tu algoritmo. Puedes crear una clase que extienda de Vector, debe ser un bean o POJO. Un POJO es una clase con cierto patrón que consiste en: propiedades privadas un constructor vacío como mínimo y métodos getter y setter. Un método getter es un método público que te permite obtener una propiedad (recuerda que la propiedad es privada por lo tanto no podemos acceder directamente a ella) y un método setter es un método público también que permite asignarle un valor a una propiedad. Voy a dividir mi respuesta en 2 xq el móvil no me deja xD


Título: Re: pasar un objeto a un objeto, es posible??
Publicado por: Mitsu en 12 Marzo 2014, 16:49 pm
Este es el concepto de encapsulamiento cuyo objetivo es encapsular las propiedades del resto de clases. Sabiendo ya esto aplícalo a una clase que extienda de Vector, utiliza setters y getters, ej:

Código
  1. public class Dimensiones extends Vector {
  2.  
  3. // atributos
  4.  
  5. public Vector() {}
  6.  
  7. // un constructor que reicba los atributos (opcional)
  8.  
  9. // getters y setters
  10.  
  11. }
  12.  

Código
  1. public void setDimensionX(double dim) { dimensionx = dim; }// lo mismo con dimensiony


Y el getter seria asi:
Código
  1. public double getDimensionX(){ return dimensionx; }


Y asi con todas las propiedades de la clase. Luego setteas los valores de las propiedades y desde el constructor de Muro accedes a las propiedades de esta clase tan solollamando a sus getters.

Código
  1. new Muro(new Dimensiones(valor1, valor2), new Dimensiones(valor1, valor2));
  2.  

Código
  1. public Muro(Vector v1, Vector v2) {
  2.       v1.getDimensionX();
  3.       // lo demas
  4. }
.

Saludos.


Título: Re: pasar un objeto a un objeto, es posible??
Publicado por: kikian94 en 13 Marzo 2014, 08:41 am
ya lo arregle y me funciona perfectamente, muchas gracias :)