pasar un objeto a un objeto, es posible??

Iniciado por kikian94, 11 Marzo 2014, 11:52 AM

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

kikian94

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 (java) [Seleccionar]
public class Vector {

    private final int N;         // length of the vector
    private double[] data;       // array of vector's components

    /**
     * create the zero vector of length N
     * @param N Vector length.
     */
    public Vector(int N) {
        this.N = N;
        this.data = new double[N];
    }

    /**
     * create a vector from either an array or a vararg list
     * this constructor uses Java's vararg syntax to support
     * a constructor that takes a variable number of arguments, such as
     * Vector x = new Vector(1.0, 2.0, 3.0, 4.0);
     * Vector y = new Vector(5.0, 2.0, 4.0, 1.0);
     * @param data Initial value of the vector.
     */
    public Vector(double... data) {
        N = data.length;

        // defensive copy so that client can't alter our copy of data[]
        this.data = new double[N];
        for (int i = 0; i < N; i++)
            this.data[i] = data[i];
    }
//*metodos*/


muro:
Código (java) [Seleccionar]
public class Muro {


public static final double NO_IMPACTO = 999.0;
protected Vector posicion;
private Vector dimensiones;

/**
* Crea un muro.
*
* @param Vector - con las coordenadas del centro del muro.
* @param Vector - con las dimensiones del muro (semianchura, semialtura).
*/
public Muro(Vector posicion,Vector dimensiones){
this.posicion = posicion;
this.dimensiones = dimensiones;


main:

Código (java) [Seleccionar]

import java.awt.*;
public class Main {

public static void main(String[] args) {


Muro muro[5];
int i;
muro[0]= new Muro(0, .5, .005, .5);
muro[1]= new Muro(.5, 1, .505, .005);
muro[2]= new Muro(1, .5, .005, .5);
muro[3]= new Muro(.5, .65, .005, .2);
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?

egyware

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 (java) [Seleccionar]

public Muro(double ax, double ay, double bx, double by)
{
   this(new Vector(ax, ay), new Vector(bx, dy));
}


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

kikian94

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

egyware

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 (java) [Seleccionar]

new Muro(new Vector(0, .5), new Vector(.005, .5));


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

Mitsu

Cita de: kikian94 en 11 Marzo 2014, 15:32 PMque 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 (=java) [Seleccionar]

// valores para el vector 1
Collection<Double> coleccion1 = new ArrayList<>();
coleccion1.add(0.5);
coleccion1.add(7d);
coleccion1.add(.35);
// valores para el vector 2
Collection<Double> coleccion2 = new ArrayList<>();
coleccion2.add(0.8);
coleccion2.add(4d);
coleccion2.add(.65);

                Muro[] muro = new Muro[5];
                muro[0] = new Muro( new Vector<Double>(coleccion1), new Vector<Double>(coleccion2) );
                // el resto

kikian94

Cita de: 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 (java) [Seleccionar]

new Muro(new Vector(0, .5), new Vector(.005, .5));


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

kikian94

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);

egyware

#7
Cita de: 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);

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 (java) [Seleccionar]

public class Muro
{
public Muro(int _x, int _y,int _w, int _h )
{
x = _x;
y = _y;
w = _w;
h = _h;
}
public int x;
public int y;
public int width;
public int height;
}
Muro muro = new Muro(10,20,40,60);


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 (java) [Seleccionar]

Graphics g = getGraphics();
g.fillRect(muro.x, muro.y, muro.w, muro.h);

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)

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







kikian94

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 (java) [Seleccionar]
new Muro(new Vector(0, .5),new Vector(.005, .5))
que tengo que hacer refernecia al objeto muro y asu vez a vector?

egyware

Pero fíjate lo que hace el constructor.

Código (java) [Seleccionar]

public Muro(Vector posicion,Vector dimensiones)
{
this.posicion = posicion;
this.dimensiones = dimensiones;
}


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