Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Java composicion

Hola buenos días. Tengo un problema, quiero saber como hacer referencia al objeto que contiene un objeto. Es decir:

Class AA {
public imprimir();
BB objeto;
}

Class BB{
public hola () { //Aquí quiero invocar a la función imprimir }
}

Mi pregunta es como puedo desde la clase BB invocar un método del objeto que lo contiene. Obviamente podría pasar a la función hola un objeto AA de parámetro, pero ¿hay alguna otra forma de hacer referencia el objeto contenedor?

noviembre 27, 2014 | Unregistered CommenterRuben

Hola Ruben.
Si definis la clase BB como una clase interna de AA vas a tener acceso a todos los metodos de la clase AA.

Saludos.

noviembre 28, 2014 | Registered Commenteralaguslaz

No quiero definir la clase BB dentro de la clase AA, ya que la clase BB extiende de una clase abstracta, además tendría que meter muchas clases dentro de AA ya que no es solo BB si no que son muchas otras que tienen el mismo problema.

La clase AA representa una ciudad, la clase BB representa un edificio y para mejorar ese edificio tengo que restar recursos de la ciudad (AA). En el metodo mejorar de la clase BB tengo que llamar al método restar recursos de la clase AA, entonces quiero saber como hacer referencia al objeto contenedor que contiene el objeto edificio(BB).

Si fuese al reves sería muy facil.
AA a = new AA();
a.b(objeto BB)

Pero como hago referencia al objeto 'a' desde el objeto 'b'

noviembre 28, 2014 | Unregistered CommenterRuben

Correcion que puede parecer que da un poco de error, corrijo el ultimo codigo:

AA a = new AA();
a.b // Objeto BB, antes estaba entre paréntesis y podía parecer parte del codigo

noviembre 28, 2014 | Unregistered CommenterRuben

Contestando a tu primer mensaje, lo primero que tienes que tener en cuenta es que imprimir() no es una función. Es un método de la clase AA y, por como lo tienes definido, es un método de instancia, es decir, sólo puedes invocarlo dentro de un objeto instanciado de la clase AA. El método imprimir() va inequívocamente ligado a un objeto AA; si realmente fuera una función, sería "imprimirAA(AA objetoParaImprimir)".

Si, de alguna forma, ese método imprimir() sirviera para imprimir algo genérico, entonces deberías definirlo como static:


class AA {
public static void imprimir() {...}
}

Y lo usarías desde un objeto de clase BB así:


class BB {
public hacerAlgo() {
...
AA.imprimir(); // OJO: clase AA, no un objeto a de clase AA
...
} // Fin de hacerAlgo()
} // Fin de la clase

Si tienes muchas funciones como la de arriba que no están ligadas a instancias de un objeto, es habitual crear una clase estática (que no se instancia) y que contiene una colección de métodos estáticos (funciones) de uso general. Por ejemplo, la clase Math o la clase Collections de la API de Java tienen muchos métodos de este tipo.

Contestando a la pregunta de tu último mensaje, Pero como hago referencia al objeto 'a' desde el objeto 'b', necesitas disponer de una referencia al objeto a dentro de b. Una forma fácil de hacerlo podría ser ésta:


class AA {
private BB b;
public AA() {
this.b = new BB(this);
...
} // Fin del constructor AA()
...
} // Fin de la clase AA

class BB {
private AA parent;

public BB(AA parent) {
super();
this.parent = parent;
} // Fin del constructor BB(AA Parent)
...
public void hacerAlgo() {
...
parent.imprimir();
...
} // Fin de hacerAlgo()
} // Fin de la clase BB

noviembre 28, 2014 | Registered Commenterrickiees

Hola Ruben.
Me gano de mano rickiees.

1) Una aclaracion: Que una clase herede de otra que es abstracta no impide que pueda ser definida como clase interna.

2)Como ya te comento rickiees, podes hacer que el metodo de la clase AA sea estatico, con lo cual no necesitas crear una instancia de AA para invocarlo, o pasar una referencia del objeto de AA al constructor de BB, donde lo asignas a un miembro privado de BB.
Ej:
public class AA{
//Referencia a un objeto del tipo BB inicializado en el constructor.
private BB bb;

//Constructor de la clase AA.
public AA(){
bb = new BB(this);//Le pasa la referencia de "este" objeto (o sea AA) al constructor de BB.
}

//Metodo que sera llamado desde BB.
public void restarRecursos(){

}
}


class BB{

//Referencia al objeto AA.
private AA aa;

public BB(AA a){
//Inicializa el miembro privado aa con la referencia que recibe en el constructor.
this.aa = a;
}

//Llama al metodo de AA desde un metodo de BB.
public void mejorar(){
aa.restarRecursos();
}
}

noviembre 28, 2014 | Registered Commenteralaguslaz

Antres que nana recordemos que la programacion oritanta a objectos se diferencia a la programacion estructurada que todo se maneja como un objeto dentro de otro. Son como capas una encima de la otra. Cuando creas la intancia de un objecto creas las capas a medida que instancias objectos internos de una intancia se van creando capas hacia adentro.

Para que una capa u objecto que este en un nivel inferior (BB) pueda acceder a la capa u objeto exterior (AA) debe ser enviada la referencia de AA a BB solo asi accede a todos los atributos y metodos de la capa exteriror en el momento de su construcción a través del constructor [ new BB(AA referenciaObject) ]

Si muchas capas u objetos tienen un mismo método entonces se usa la herencia de objetos así no es necesario pasar la referencias, esto se hace implícitamente en la pila de objetos.

Si hay un método que no necesita interactuar con ninguno de los atributos o metodos del objeto, entonces se declara el método estatico (static).

Lo que decesas hacer se puede hacer facilmente en c o c++, pero en Java todo esta restringido debido a que los punteros los maneja la maquina virtual de Java.

diciembre 2, 2014 | Registered Commenternelsonxx1