Java: Heredar objeto clase padre en subclase

Zerokkk

Buenas!

Estos últimos días, por aburrimiento, me puse a codificar un pequeño juego estilo OGame para coger práctica y de paso aprender alguna cosilla (Estudio un ciclo superior de Desarrollo deAplicaciones Multiplataforma, primer año).

Hasta ahora todo fue muy bien, pero tengo una última cosa que no consigo solucionar.

  1. Creé un objeto en la clase padre que referenciaba a una clase donde realizaba las compras de unidades. Me funcionó todo perfecto, me colocaba mis acciones donde debía y podía luego comprobarlas desde el main.

  2. En otra opción del menú del main, está la de "batalla". Digamos que aquí le he intentado llevar las variables de todas las formas posibles, pero no he encontrado forma. Finalmente, cambié un poco el diseño para que tuviera que enviárselo referenciando el objeto del que antes hablaba, pero DESDE esa segunda clase (la cual hice extendida de la primera).

Mi pregunta es... ¿Es posible utilizar un objeto de la clase padre en la clase hija? Y en tal caso... ¿Cómo se hace? Gracias!

cabron

En tu explicación no me he enterado de si estás hablando de herencia, composición o clases andidadas, pero por lo que pones en el título, intuyo que:

-Tienes una clase A que tiene un miembro C
-Tienes una clase B hereda de A
-Tienes una instancia de B y quieres acceder a C

Si es eso, declara en A la variable miembro para contener a C como protected, y puedes acceder directamente a ella desde B.

No siempre es buena solución ya que a veces interesa encapsular partes de la superclase incluso a sus clases derivadas, pero bueno no tiene pinta de que ahora estés para calentarte la cabeza con eso todavía.

1 respuesta
Zerokkk

#2 Tengo varias clases, pero en esto trabajamos con 3:

Clase A (con el main).
Clase B (market).
Clase C, que extiende la Clase A.

En Clase A tengo un objeto que instancia la Clase B, y lo que quiero es utilizar ese objeto en la Clase C. ¿Es posible?

PD: He tomado un camino alternativo y he solucionado el problema. Pero sigo interesado en saber si se puede hacer esto.

#4 Se podría decir que sí.

2 respuestas
BLZKZ

#3 no se si te he entendido bien, pero creo que lo que quieres es algo parecido a singleton, que solo haya una instancia de un objeto B y que que sea la misma en A y en C.

1 respuesta
Khanser

#3 Si la visibilidad de ese atributo no es privada, es publica o protegida (o default estando la clase hija en el mismo paquete que la clase padre). Puedes acceder al objeto haciendo "super.objeto" (Aunque de hecho si es publica o protected puedes acceder desde "this.objeto" )

1 respuesta
BLZKZ

#5 en ningún sitio dice que sea atributo, pero en el caso de que lo fuera estás en lo correcto :)

tracker086

#1 según te comentan por aquí hay muchas formas de poder hacerlo.

Yo de cara a buenas prácticas y tal, creo que la más adecuada es usar el patrón de inyección de dependencias. http://es.wikipedia.org/wiki/Inyecci%C3%B3n_de_dependencias

1
JuAn4k4

Puedes hacerlo con un getter o con protected como te dicen.

Pero vamos, que no se yo como estara.

Puedes deicrnos que hace cada clase ?

Es que parece que la estas heredando de una clase para poder tener sus cosas y jugar con ellas simplemente.

1 respuesta
Lecherito

Con lo fácil que es hacer un minidiagrama de clases y todo el mundo se entera con un vistazo >.<

Pero vamos, como te han dicho con un getter y vas que chutas.

Zerokkk

#8 La clase Market hereda de la clase Account todos sus atributos para mayor facilidad a la hora de acceder a los mismos. Los hereda en su constructor con un super y luego el resto de clases trabajan con éste, en lugar de con el de Account (ha sido un pequeño arreglo para solucionar un problema por el cual no se me guardaban bien los cambios en Account realizados desde Market).

La idea era acceder al objeto de Market que hacía desde la clase principal, para acceder a estos atributos. Pero al final lo solucioné de manera más fácil extrapolando sus datos a nuevos atributos en la clase principal y enviando éstos como parámetros a la clase Battle (donde quería meter ese objeto), así que el problema ya está arreglado.

Sé que tiene muchas idas de olla lo que acabo de comentar, pero es la primera vez que hago algo medianamente "amplio" en Java y tenía algunos conceptos mal cogidos o poco practicados. Con la tontería he aprendido bastante haciendo esto, pues aunque me quedase un poco chapucero al final, funciona a las mil maravillas, que es lo importante xD.

  • -

De todos modos... ¿A qué te refieres con los getter y los protected? ¿Te refieres a los métodos de acceso get?

JuAn4k4

Vamos que la has liado parda, porque Market, Account y Battle no tienen nada que ver.

Me he dejao cosillas pero vamos, para que entiendas un poco lo que queria decir :

public class Account {

 private String username;
 
 private double money;

 private double difficulty = 1.0;

 public Account() {

 }
 // Esto es un getter
 public String getUsername() {
   return username;
 } 
  // esto es un setter
 public void setUsername(String username) {
   this.username = username;
 }

  // lo mismo para money

  public bool purchase(double ammount) {
      // con esto habria que tener cuidado de que no accedieran 2 a la vez..
      if (this.money > ammount * difficulty) {
          this.money = this.money - ammount;
          return true;
      }
       return false;
  }
}
public class Market {

 private Account account;

 public Market(Account account) {
   this.account = account;
 }
 
 public Soldier purchaseSoldier() {
   if (account.purchase(PRICE_SOLDIER){
      return new Soldier();
   }
   return null;
 }

}
public class Battle {

  protected Market market;
  protected Army army;

  public Battle(Account account) {
     this.market = new Market(account);
     this.Army = new Army();
  }
 
  public bool AddSoldier() {
    if (army.hasFoodForSoldier()) {
      Soldier soldier = market.purchaseSoldier();
      if (soldier != null) { 
         army.addSoldier(soldier);
      } 
      return false;     
} } } public class ExtremeBattle extends Battle { public ExtremeBattle(Account account) { super(account); account.setDifficulty(2.0); // Las cosas el doble de caras es extreme, o como quieras ponerlo. market.disable(Army.TANKS); // lo que quieras hacer .. } } clase Army y Soldier y demás que necesites..
1 1 respuesta
Zerokkk

#11 No, si el programa funciona bien. Lo dejé a medias y aún le quedan retoques, pero está funcionando bien y comunicando a la perfección todas las variables.

Lo que por cierto, no sabía, era que pudieras mover objetos entre clases y demás, me pareció interesante pero prefiero dejarlo para cuando lo vea en el ciclo.

1 respuesta
BLZKZ

#12 mover objetos entre clases? wtf :S

Yo cuando entro a este hilo y veo, no entiendo una puta mierda XD

4 1 respuesta
JuAn4k4

Creo una instancia de la clase Market al que le paso una instancia de la clase Account.

Los objetos estan para jugar con ellos, las variables son internas y normalmente no deberias necesitar ni verlas.

1 respuesta
Zerokkk

#14 Vale bien, ya lo vi, sí que es lo que inicialmente quería. Aunque ya esté solucionado por otro método (enviando los atributos, simplemente) no sabía si esto era posible. Para mi próxima prueba intentaré utilizar esta metodología. Gracias!

Fr4nk0

#13 +1

Usuarios habituales

  • Fr4nk0
  • Zerokkk
  • JuAn4k4
  • BLZKZ
  • tracker086
  • Khanser
  • cabron