Foros del Web » Programación para mayores de 30 ;) » Java »

Visibilidad de clases abstractas en packages

Estas en el tema de Visibilidad de clases abstractas en packages en el foro de Java en Foros del Web. Hola, un saludo. En una práctica de java y me he encontrado el siguiente fenómeno. En un package tenía una clase pública llamada Plantilla, en ...
  #1 (permalink)  
Antiguo 28/09/2009, 08:25
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 8 meses
Puntos: 188
Visibilidad de clases abstractas en packages

Hola, un saludo.

En una práctica de java y me he encontrado el siguiente fenómeno.

En un package tenía una clase pública llamada Plantilla, en la que se instanciaba a otra clase que era abstractca y también pública llamada Empleado, para obtener un array de objetos Empleado.

El hecho es que desde una clase del proyecto, donde tengo el main, hago la llamada a plantilla para que cree el array de empleados, pero si intento acceder a ese array, no me lo permite.

Sin embargo, si saco ambas clases del package y las incluyo en el proyecto, es posible acceder a dicho array desde el main.

¿Que ocurre entonces con la clase Empleado? ¿Por el hecho de estar en un package se modifica la visibilidad aunque se haya definido como Public?
  #2 (permalink)  
Antiguo 28/09/2009, 17:04
 
Fecha de Ingreso: julio-2009
Mensajes: 5
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: Visibilidad de clases abstractas en packages

Como que "se instanciaba otra clase abstracta" ??

Las clases abstractas no se pueden crear objetos apartir de ellas, es decir, no puedes decir Abstracta claseAbstracta = new Abstracta();

Si no es ese tu caso, te invito a que te expliques un poco mejor.

Suerte
  #3 (permalink)  
Antiguo 29/09/2009, 05:07
 
Fecha de Ingreso: septiembre-2009
Ubicación: Madrid
Mensajes: 16
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Visibilidad de clases abstractas en packages

Sacado del pozo de sabiduria friki que es lady4j:

Una clase abstracta, al igual que un interfaz no se pueden instanciar directamente, es necesario conseguir de alguna forma una instancia de una clase concreta que herede de la clase bastracta o implemente el interfaz.

Esto en ocasiones se hace mediante la creacion de una instancia de un tipo diferente pero compatible:

List miLista = new ArrayList();

O mediante el uso de una factoria o proveedor de clases concretas:

Connection conexionBBDD = DriverManager.getConnection("jdbc:mysql:...");

Respuesta proporcionada por expertos en Java a partir de información facilitada por lady4j.com
  #4 (permalink)  
Antiguo 29/09/2009, 07:00
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 8 meses
Puntos: 188
Respuesta: Visibilidad de clases abstractas en packages

A ver, creo que no me habeis entendido:

Lo que yo hago es instanciar la clase plantilla, que no es abstracta, pero que genera un array (en un principio vacío) de elementos de tipo empleado (que es la clase abstracta).

Ahora bien, para añadir un empleado a esta lista, no puedo hacerlo directamente, como decís, pero lo que hago es instanciar otra clase derivada de Empleado (Jardinero o Comercial por ejemplo).

así:

Jardinero emp1 = new Empleado(arg1, arg2);
o
Comercial emp2 = new Empleado(arg1, arg2);

Y luego haría:

plantilla.empleados[0] = plantilla.añadirEmpleado(emp1);
plantilla.empleados[1] = plantilla.añadirEmpleado(emp2);

Ahora bien, el problema viene al intentar acceder al elemento plantilla.empleados[i], y a los métodos asociados a la clase Empleado, en el caso de que tanto la clase Plantilla como la clase Empleado y sus clases hijas se encuentren en un package que importo desde la clase Gerencia (que es la que está directamente en la Solución del proyeto y que contiene el main() ).

Sin embargo, cuando tengo todas las clases directamente en la solución del proyecto, puedo acceder tanto a empleados[i] como a sus métodos... getSalario(etc). Y lo que me interesa saber es por qué se produce este fenómeno.

Espero que ahora me haya explicado.
  #5 (permalink)  
Antiguo 01/10/2009, 02:22
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 8 meses
Puntos: 188
Respuesta: Visibilidad de clases abstractas en packages

hasta ahora nadie me ha sabido responder a qué se debe esto, me estoy desanimando :(
  #6 (permalink)  
Antiguo 05/10/2009, 01:48
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 8 meses
Puntos: 188
Respuesta: Visibilidad de clases abstractas en packages

Sigo intentándolo por si alguien se atreve a responder.
  #7 (permalink)  
Antiguo 05/10/2009, 09:43
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Visibilidad de clases abstractas en packages

Hola,

Hice todo lo posible por reproducir el problema que comentas, pero no está bien claro, primero 'una clase abstracta no se puede instanciar'.

Jardinero emp1 = new Empleado(arg1, arg2);

Empleado no puede ser abstracto en ese caso, no se puede usar new. Por todo lo demás no hay problema se puede accesar en cualquier package sin ningún problema.

Talves podrías preparar un ejemplo mas específico del problema para que podamos ver exactamente que es lo que estas haciendo.

Posiblemente te sea de alguna ayuda:
http://java.sun.com/docs/books/tutor...sscontrol.html

Saludos,
  #8 (permalink)  
Antiguo 05/10/2009, 11:15
 
Fecha de Ingreso: septiembre-2009
Ubicación: Madrid
Mensajes: 16
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Visibilidad de clases abstractas en packages

Cita:
Iniciado por Fuzzylog Ver Mensaje
Sigo intentándolo por si alguien se atreve a responder.
FuzzyLog, no puedo hablar por el resto, pero no me he molestado en leer tu reply por lo que has puesto de "no me habeis entendido", si hubieras puesto "me explico muy mal, disculparme" yo le hubiera dedicado mas tiempo a tu tema.

De todas las frases cripticas e indocumentadas me quedo con esta: "instanciar la clase plantilla, que no es abstracta"

Te recomiendo lo mismo que HackmanC y ademas el siguiente link:

sindominio.net/ayuda/preguntas-inteligentes.html

Ahora que me paro a leer tu post: ¿PERO QUE TIPO DE CODIGO ES ESTE?!!!

plantilla.empleados[0] = plantilla.añadirEmpleado(emp1);

XXXDDD

En fin, me vuelvo al tajo.
  #9 (permalink)  
Antiguo 05/10/2009, 15:21
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 8 meses
Puntos: 188
Respuesta: Visibilidad de clases abstractas en packages

El "no me habeis entendido" se puede deber a muchos motivos, entre ellos, por qué no, a que me haya explicado mal.

De hecho, acabo de revisar el código, y he encontrado algunas erratas, derivadas de escribir de memoria, con mi "memoria de pez".

La forma de crear un empleado sería:

Jardinero emp1 = new Jardinero(arg1, arg2);
o
Comercial emp2 = new Comercial(arg1, arg2);

Queda claro que estas clases no son abstractas, sino que derivan de una clase abstracta, que es Empleado, y que como todo el mundo dice, no se puede instanciar.

luego tengo ...

p.añadirEmpleado(emp1);
y
p.añadirEmpleado(emp2);

donde añadirEmpleado es un método de la clase plantilla, que he instanciado como "p", y que es la que genera el Array de Elementos Empleado del que hablaba.

El problema es que si solo tengo la clase del main en el proyecto, y el resto de clases las tengo en un package y las importo desde la clase del main, el eclipse no me deja ver más allá de la instancia de plantilla, es decir, que no puedo preguntarle a la aplicación si el elemento p.empleados[0] (donde p es la instancia de plantilla y empleados[0] es primer elemento del array de Elementos Empleado) es un comercial o un jardinero, por ejemplo (para cada tipo implementé un método que devolvía un boolean según fuese de una u otra clase). El hecho es que con esta construcción del proyecto, "empleados[]" no es visible.

Sin embargo, si saco esas clases del package y las pongo en el mismo path que la clase del main(), entonces sí que puedo ver "empleados[]" y acceder a cada uno de sus elementos, y a los métodos de los mismos.

raullapeira, lo siento si mis frases te resultaron demasiado crípticas e indocumentadas, y por ello te has herniado en tu intento de ver por encima mi tema, lo siento de verdad, no era mi intención. Simplemente soy así.

Si ahora has podido entrever algo sin que tenga que ponerte todo mi código, será bienvenida tu inmensa sapiencia ;).
  #10 (permalink)  
Antiguo 05/10/2009, 16:59
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Visibilidad de clases abstractas en packages

Hola,

Lo único que se me ocurre es que estés usando 'protected' en la definición de Array.
En ese caso la visibilidad se ve afectada de la forma como 'yo entendí' que escribiste.

Saludos,
  #11 (permalink)  
Antiguo 06/10/2009, 00:59
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 15 años, 8 meses
Puntos: 188
Respuesta: Visibilidad de clases abstractas en packages

Eso es lo que yo pensé en un principio, HackmanC, pero luego comprobé que era public, por eso me extrañó el comportamiento de aparentar tener una visibilidad distinta de la que tiene realmente. Y aún no he podido encontrar una explicación para ello.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:07.