msr 0 Denunciar mensagem Publicado 23 de Abril de 2010 Olá, Isto hoje é só duvidas Coloco a dúvida como comentário no código, pois parece-me ser mais fácil entender dessa maneira. public class Xpto{ protected ClasseAbstracta x; public void foo(){ // ClasseAbstracta novo = new ????? Carro ou Pessoa ????? /* aqui preciso de instanciar um novo objecto com classe igual à do referenciado por this.x sei que se fizer x.getClass() sei a classe do objecto (que será Carro ou Pessoa) , no entanto não estou a ver como posso sacar e UTILIZAR o(s) respectivo(s) construtor(es) */ // ... outras operações (que dependem se é Carro ou Pessoa) } } public abstract class ClasseAbstracta { } public class Carro extends ClasseAbstracta{ } public class Pessoa extends ClasseAbstracta{ } Deu para entender a dúvida? Alguma sugestão? Obrigado COMPONENT ORGANIZER easily organize your electronic parts and application notes Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Baderous 33 Denunciar mensagem Publicado 23 de Abril de 2010 Não percebi a dúvida, mas não podes instanciar classes abstractas. O que podes fazer é atribuir a uma variável de tipo estático ClasseAbstracta, uma instância de tipo dinâmico que seja seu subtipo concreto, isto é, que seja uma subclasse concreta de ClasseAbstracta. Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
msr 0 Denunciar mensagem Publicado 23 de Abril de 2010 Não percebi a dúvida, mas não podes instanciar classes abstractas. O que podes fazer é atribuir a uma variável de tipo estático ClasseAbstracta, uma instância de tipo dinâmico que seja seu subtipo concreto, isto é, que seja uma subclasse concreta de ClasseAbstracta. Isso mesmo. Ou seja "x" é uma referência para um Carro ou para uma Pessoa (atribuição feita algures no código, que não pus aqui). O que quero fazer no método foo() é criar um novo objecto do mesmo tipo do "x" (que pode ser Carro ou Pessoa). Para saber que classe é uso o "getClass()", no entanto como acedo ao construtor dessa classe? Eu penso que isto passa pelo "reflection package", mas não estou a ver como utilizar o getConstructor(). COMPONENT ORGANIZER easily organize your electronic parts and application notes Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Baderous 33 Denunciar mensagem Publicado 24 de Abril de 2010 Ou fazes isso com um if/else ou com Reflection (não sei se dá, apenas li por alto a página). Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
pedrix21 0 Denunciar mensagem Publicado 24 de Abril de 2010 Podes fazer o instanceof ex: if(obj instanceof carro){ //obj é uma instancia de carro } @Pedro Lopes Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
msr 0 Denunciar mensagem Publicado 24 de Abril de 2010 O instanceof e o if/else funcionariam, mas limitadamente. Vou concretizar um pouco mais a situação, talvez se perceba melhor. Tenho estas classes: - abstract Evento - EventoReproducao extends Evento - abstract Entidade - Pessoa extends Entidade - Carro extends Entidade Um evento tem uma referência para uma Entidade (isto é um evento está sempre associado a uma entidade). Essa entidade pode ser qualquer coisa: uma pessoa, um carro, etc. bastando para isso estender a classe Entidade. Considerem agora este caso: public abstract class Evento{ protected Entidade entidade; public Evento(){ this.entidade = entidade; } } public class EventoReproducao extends Evento{ public EventoReproducao(Entidade entidade){ super(entidade); } } Evento e = new EventoReproducao(new Pessoa()); // pai e.foo(); // cria um filho Ao criar um filho ( ) preciso saber que tipo de objecto tenho que criar. Usando if/else ou instanceof poderia ver se o "pai" era do tipo Pessoa ou Carro, mas o que me interessa é que possa ser qualquer tipo de entidade. COMPONENT ORGANIZER easily organize your electronic parts and application notes Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Knitter 102 Denunciar mensagem Publicado 24 de Abril de 2010 Se no evento criaste uma Pessoa no método foo() queres criar também uma Pessoa? Porquê, porque é que não podes usar a instância que já tens? O que é que pretendes fazer. Do meu ponto de vista, o que estás a explicar não faz sentido, não estou a ver uma situação onde tenhas mesmo de instanciar um objecto que seja do mesmo tipo que um outro, mas não percebi bem o problema. De qualquer modo, a forma de fazer isso correctamente é usando Reflection, não precisas de usar muito do sistema de Reflection, é simples instanciar um objecto a partir de uma String com o nome ou da Class. www.sergiolopes.eu Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
msr 0 Denunciar mensagem Publicado 24 de Abril de 2010 Knitter, pensa como "na realidade". Isto é um EventoReproducao que diz respeito a uma entidade. Quando esse evento ocorre é criado um "filho" com o mesmo tipo da entidade a que diz respeito esse evento. O que pretendo é que estes eventos se possam associar a qualquer tipo de entidade, não a penas a pessoas e carros. Só sei que são entidades (que é uma classe abstracta e portanto não posso instanciar objectos), portanto quando quiser criar um filho preciso de saber o tipo da entidade a que este se refere. De qualquer das formas, já me safei com isto, deixo aqui o código caso apareça mais alguem com a mesma duvida: Class<? extends Entidade> c = this.entidade.getClass(); Constructor<? extends Entidade> ct = c.getDeclaredConstructor(Conjunto.class); Entidade filho = ct.newInstance(this.entidade.conjunto); COMPONENT ORGANIZER easily organize your electronic parts and application notes Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
Knitter 102 Denunciar mensagem Publicado 24 de Abril de 2010 Knitter, pensa como "na realidade". Isto é um EventoReproducao que diz respeito a uma entidade. Quando esse evento ocorre é criado um "filho" com o mesmo tipo da entidade a que diz respeito esse evento. Esta descrição grita-me "clone", e sendo assim não precisas saber o tipo de dados, apenas cloná-lo. Mas pegando no que tinha apresentado: Evento e = new EventoReproducao(new Pessoa()); // pai e.foo(); // cria um filho Neste caso queres criar um filho de Pessoa ou queres criar uma nova Pessoa? www.sergiolopes.eu Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites
msr 0 Denunciar mensagem Publicado 24 de Abril de 2010 Mas pegando no que tinha apresentado:Neste caso queres criar um filho de Pessoa ou queres criar uma nova Pessoa? Não sei se percebi a pergunta. Não são sinónimos? Em qualquer dos casos é um novo objecto do tipo Pessoa que é criado. "filho" e "pai" sao objectos do mesmo tipo. O filho não é um "clone" do pai, "herda" algumas características do pai apenas (ie, os atributos têm dados diferentes dos do pai). COMPONENT ORGANIZER easily organize your electronic parts and application notes Partilhar esta mensagem Ligação para a mensagem Partilhar noutros sites