Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

msr

getConstructor() ?

Mensagens Recomendadas

msr

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

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

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().

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
msr

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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
msr

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);

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Knitter

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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
msr

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).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.