elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Acceder a atributo de subclase
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Acceder a atributo de subclase  (Leído 3,165 veces)
Baal_30

Desconectado Desconectado

Mensajes: 248



Ver Perfil
Acceder a atributo de subclase
« en: 5 Mayo 2015, 22:11 pm »

Muy buenas. Hoy se me ha planteado una duda que no logro resolver.

He creado 2 clases, Conductor y Taxista (subclase de Conductor).

También he creado un ArrayList<Conductor> para meter instancias de Taxista (porque también he hecho otra clase que hereda de Conductor, y necesito guardarla en el mismo ArrayList). El caso es que no me deja acceder a los atributos ni métodos de Taxista.

Intento este código pero nada : conductores.get(0).getAtributoDelTaxista(); 
Donde conductores es el ArrayList<Conductor> con instancias de Taxista y otra subclase.

Así que esa es mi pregunta, ¿como podría acceder a los atributos y métodos de una subclase?

Gracias.


En línea

«La suerte es el cuidado de los detalles». -Winston Churchill
PabloPbl

Desconectado Desconectado

Mensajes: 188


Ver Perfil
Re: Acceder a atributo de subclase
« Respuesta #1 en: 5 Mayo 2015, 22:50 pm »

Eso pasa por que tu estas guardando conductores y no taxistas en tu ArrayList, recuerda que tu haces heredar los taxistas de conductor y no los conductores de taxistas.

En el ArrayList deberías guardar taxistas, y de esa manera ya podrías acceder a los atributos y métodos de la clase "Taxista" y de su superclase que es "Conductor".

Saludos.


En línea

Baal_30

Desconectado Desconectado

Mensajes: 248



Ver Perfil
Re: Acceder a atributo de subclase
« Respuesta #2 en: 5 Mayo 2015, 22:54 pm »

Pero, si tengo por ejemplo, Taxistas y Repartidores, ambas clases que derivan de Conductores, y quiero meter instancias de las dos en el mismo arrayList, tendría que hacerlo de Conductores ¿no? Ahí es cuando viene el problema :/
En línea

«La suerte es el cuidado de los detalles». -Winston Churchill
PabloPbl

Desconectado Desconectado

Mensajes: 188


Ver Perfil
Re: Acceder a atributo de subclase
« Respuesta #3 en: 5 Mayo 2015, 23:01 pm »

No, lo mas conveniente seria tener un ArrayList para cada trabajo. Si tu haces un ArrayList de conductores, nunca podrás acceder a los atributos de sus subclases. En cambio si lo haces como te digo si podrás, ya que cada trabajo hereda de Conductor y por tanto tienes acceso a los atributos y métodos de las clases de los trabajos.
En línea

Baal_30

Desconectado Desconectado

Mensajes: 248



Ver Perfil
Re: Acceder a atributo de subclase
« Respuesta #4 en: 6 Mayo 2015, 11:57 am »

Ya, ya, haciendo dos arrayList diferentes si que se podría, pero yo necesito crear sólo uno...

Entonces es imposible acceder a los datos que quiero de esa manera ¿? :/
En línea

«La suerte es el cuidado de los detalles». -Winston Churchill
Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: Acceder a atributo de subclase
« Respuesta #5 en: 6 Mayo 2015, 15:42 pm »

Ejemplo práctico:

Queremos crear conductores y guardarlos en una lista. Éstos conductores pueden ser de 2 tipos, taxistas o choferes de transporte público. También se deberá recuperar los tipos de conductores de la lista.

Código
  1. public class Conductor {
  2.    private Integer id;
  3.    private String names;
  4.    private String surnames;
  5.    private String dni;
  6.  
  7.    public Conductor() {}
  8.    public Conductor(Integer id, String names, String surnanes,
  9. String dni) {
  10. this.id = id;
  11. this.names = names;
  12. this.surnames = surnames;
  13. this.dni = dni;
  14.    }
  15.    // getters y setters
  16. }
  17.  

Código
  1. public class Taxista extends Conductor {
  2.    private String placaAuto;
  3.    private String horario;
  4.  
  5.    public Taxista() {}
  6.    public Taxista(Integer id, String names, String surnames,
  7. String dni, String placaAuto, string horario) {
  8. super(id, names, surname, dni);
  9. this.placaAuto = placaAuto;
  10. this.horario = horario;
  11.    }
  12.    // getter y setter
  13.    /* si usan getters y setters para los atributos heredados, llamarlos así:
  14.        super.setId(id); // set
  15.        return super.getId(); // get
  16.     */
  17. }
  18.  

Código
  1. public class ConductoresBD {
  2.    private static final List<Conductores> conductores;
  3.    static {
  4. conductores = new ArrayList<>();
  5.    }
  6.    public void insert(Conductor c) {
  7. conductores.add(c);
  8.    }
  9.    public void remove(Conductor c) {
  10. conductores.remove(c);
  11.    }
  12. }

Ahora, hagamos una clase de prueba:

Código
  1. public class Main {
  2.    public static void main(String[] args) {
  3. final ConductoresBD conductores = new Conductores();
  4. Taxista taxista = new Taxista(1, "Juan Manuel", "Figueroa Orellana",
  5. "45930168", "ZK-34539", "A");
  6. conductores.insert(taxista);
  7.  
  8. Conductor c = conductores.get(0);
  9. Taxista retrieved = null;
  10.        if(c instanceof Taxista) {
  11.    retrieved = (Taxista) c;
  12. }
  13. }

La pregunta surge cuando recuperamos los tipos de conductores de la lista, ¿cómo sé qué tipo de objeto he recuperado? Para ésto nos ayudará el operador instanceof:

Código
  1. if(c instanceof Taxista) { /* ... */ }

Lo que el operador instanceof hace es comprobar si el objeto de la izquierda es del mismo tipo que el de la derecha:

Citar
¿c es de tipo Taxista?

La respuesta es afirmativa. Por lo tanto, podemos hacer un casting (convertir) del objeto padre hacia el objeto hijo:

Código
  1. Taxista retrieved = (Taxista) c;

Y podemos usar los métodos de Taxista:

Código
  1. retrieved.setPlacaAuto("TK-45905");
  2. retrieved.setHorario("C");


Espero se haya entendido el mensaje. Saludos.
En línea

"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
PabloPbl

Desconectado Desconectado

Mensajes: 188


Ver Perfil
Re: Acceder a atributo de subclase
« Respuesta #6 en: 6 Mayo 2015, 16:38 pm »

Ya, ya, haciendo dos arrayList diferentes si que se podría, pero yo necesito crear sólo uno...

Entonces es imposible acceder a los datos que quiero de esa manera ¿? :/

No es imposible, lo que yo he puesto ahí, es una manera sencilla y mas fácil de hacer, pero si insistes con querer hacerlo así, tenes que tener mas conocimientos en el tema, la respuesta que publico Gus es especial para lo que quieres.

Saludos!
En línea

Baal_30

Desconectado Desconectado

Mensajes: 248



Ver Perfil
Re: Acceder a atributo de subclase
« Respuesta #7 en: 6 Mayo 2015, 22:47 pm »

Gus me encantan tus respuestas, pero me cuesta muchísimo entenderlas, jaja, aunque es como más aprendo :) más o menos me ha quedado claro, lo que no entiendo es porque creas ConductoresBD y el arrayList ahí, pudiendolo hacer en el main así :
Código
  1. ArrayList<Conductores> conductores = new ArrayList<Conductores>();
¿no?

Yo lo que intenté usar es getClass, pero no se utilizarlo :/ No conocía que instanceof lo hace así de fácil.

Gracias por las respuestas ¡!
En línea

«La suerte es el cuidado de los detalles». -Winston Churchill
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con Atributo %0
Scripting
NoryNR 2 2,522 Último mensaje 18 Febrero 2008, 17:01 pm
por NoryNR
B y C heredan de A. Usar objetos instanciados en otra subclase
Java
Lorkz 7 5,118 Último mensaje 15 Noviembre 2010, 05:38 am
por sapito169
Creando una subclase de Point
Java
Feedeex 4 2,481 Último mensaje 2 Agosto 2011, 01:00 am
por Feedeex
(solucionado) Que es el atributo "A"? (Atributo de archivo de almacenamiento.)
Windows
Eleкtro 2 25,734 Último mensaje 31 Enero 2012, 01:00 am
por Eleкtro
Array atributo de una clase de tamaño igual a otro atributo
Programación C/C++
cNoob 3 3,202 Último mensaje 1 Enero 2018, 21:02 pm
por cNoob
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines