JAVA - ¿Clases internas en ficheros diferentes?

Leunamal

Hola, ¿Sabeís si se puede colocar clases internas en ficheros distintos al de la clase principal a la que pertenecen?

Me explico. Imaginaos que teneis lo siguiente:

class Principal{

init(){
B obj_b = new B();
C obj_c = new C();
}

//Se crean las clases internas:
class B{}
class C{}

}

Fichero Principal.java

Lo que quiero es poner B en un B.java y C en un C.java ya que ambas clases heredan de JPanel y tienen muchas lineas de código.

¿Cúal es la forma correcta de hacer esto?

Un saludo

JuAn4k4

O las pones todas en el mismo directorio (paquete) o creas paquetes y los importas.

Principal,A,B en el mismo dir
Principal importa el paquete AB que tiene las clases A y B
Principal importa paquete pA que tiene la clase A y tb importa el paquete pB que tiene la clase B

Puedes hacerlo de alguna de esas formas, todo a su vez puede ser parte de un paquete mas gordo, pPrincipal, eso ya.. depende de lo que quieras hacer.

cabron

¿A qué te refieres cuando dices clase Interna?

Si te refieres a una clase anidada dentro de otra clase, pues por definición, no se puede, una clase anidada solo existe dentro de una clase concreta, en ningún sitio más, en el momento en el que la pones en otro fichero, puede ser importada por quien quiera hacerlo.

Bueno por tu ejemplo supongo que lo que quieres es simplemente crear una miembro de una clase que tiene como tipo otra clase, y si es eso claro que puedes ponerlas en ficheros separados, como te ha dicho #2.

Leunamal

#2 #3 Gracias por responder.

Se trata de clases anidades, el problema es ese. Las clases anidadas existen para un determinado objeto. Usan todos los atributos del objeto de la clase principal. Al ponerlos al margen, en un mismo paquete, pero en ficheros a parte, el problema que he encontrado es la accesibilidad de los atributos. Tendría que copiarme la clase principal por cada subclase por medio del método constructor de cada una de ellas.

Si las subclases no necesitasen tantas cosas de la clase principal, no tendría tantos problemas, pero no es así, las subclases alguna de ellas son jpanels, que utilizan atributos de la clase principal y que otras clases utilizan para realizar distintas operaciones como los manejadores de eventos.

bLaKnI

Pero por dios!
Que quieres hacer exactamente que necesitas complicarte tantisimo la vida?

Que no puedes solucionar mediante herencia, interficies o sencillamente, importando desde diversos paquetes? No comprendo... :S

Quieres que una classe muy tocha, cree y use objetos que conozcan plenamente como esta definida esta clase principal? Herencia.
El problema esta en que estas creando a hijos en la clase padre, y esto no puede ser.
Delega la responsabilidad a los hijos, mediante Overriding.
Y haz que el padre ejecute métodos neutros, delegando responsabilidad.

Esq no tiene lógica lo que quieres hacer!
Si quieres que estas "subclases" conozcan los atributos de la Principal, no te queda mas que la herencia. Pero si luego quieres usar estos objetos en la clase Principal, no uses clases, crea los metodos que pondrias en otras clases dentro de la principal, y ya está! Es como redundante o extraño lo que quieres hacer.

Para que hacer subclases dentro de la clase? Es una mala concepción de la estructura del codigo, a no ser que trabajes con propiedades o delegaciones.

En cuanto al tema de los jpanels y tal, no puedes delegar los métodos de display y otros a las subclases por herencia?

MaKi

como dice #5, seguro que lo puedes rediseñar mediante herencia perfectamente

Leunamal

#5 Hola, no es tan fácil como se pinta. Lo ideal sería usar herencia, pero tal como lo quiero hacer en java no es posible. Seguro que en C++ no tendría estos problemas,pero en fin... El Martes le preguntaré al tutor de mi pfc. En páginas en inglés no he encontrado nada.
La herencia no sería posible en este caso ya que se crean los objetos dentro de la clase principal (que hereda de JApplet), java muestra un error al compilar. A parte, si las subclases ya heredan den JPanel, es imposible volver heredar de otra clase.

Pero bueno, no voy a rayar más a la gente. Es algo específico lo que me ocurre.

Gracias a todos por responder.

Usuarios habituales

  • Leunamal
  • MaKi
  • bLaKnI
  • cabron
  • JuAn4k4