Setar objeto herdado de uma classe

12 respostas
furacao123

Aew galera pelo assunto fica dificil de entender o que eu preciso entao vamos la

Estou com uma duvida nas classes extends, por exemplo tenho uma classe Pessoa
public class Pessoa {

    private String nome;

    public Pessoa() {
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

}
e uma classe PessoaFisica que extends Pessoa
public class PessoaFisica extends Pessoa {

    private String cpf;

    public PessoaFisica() {
        super();
    }

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

}

Agora por exemplo gostaria de saber se tem como eu setar o Objeto Pessoa para um objeto PessoaFisica, por exemplo

public static void main(String[] args) {

        Pessoa p = new Pessoa();
        p.setNome("Joao");

        PessoaFisica pf = new PessoaFisica();
        pf.setCpf("123456789");

        pf = p;

    }

sem precisar fazer set em cada atributo?

12 Respostas

josemanzoli

Cara vc precisa rever seus conceitos de Herança.

Mas o seguinte a Super classe pode receber uma subclasse mas o contrátio não ou seja,

Pessoa p = new PessoaFisica();
            p.setNome("Teste");

            Pessoa p1 = new Pessoa();
            p1.setNome("teste");

            PessoaFisica p2 = new PessoaFisica();
            p2.setNome("Teste");
            p2.setCpf("teste");

Você consegue usar os métodos da super classe em uma subclasse mas não consegue fazer uma subclasse ser uma super classe como está fazendo.

aeciovc

pra vc setar um ao outro

um teria que conter e não ser!

pq PessoaFisica já é uma Pessoa.

agora se ela tem uma pessoa você poderia. qual o intuito disso?

furacao123

Entao esse foi apenas um exemplo no meu caso o objeto tem varios atributos e em algum momento da aplicacao eu tenho o objeto por exemplo Pessoa populado e preciso gerar um PessoaFisica, mas esse PessoaFisica ja esta populado com os atributos dele agora preciso inserir os dados da herança mas sem fazer por set pois sao varios atributos e fica massante

entao pf recebe os dados de p - Pessoa

Gustavo_Marques

Este ‘setar’ a que se refere já está implícito na instanciação de uma subclasse.

Lembre-se desta regrinha: Toda pessoa física é uma pessoa, mas nem toda pessoa é uma pessoa física;

furacao123

entao dessa maneira eu consigo popular o Pessoa mas e o inverso quero popular o PessoaFisica com um Pessoa, só é possivel chamando os metodos set?

por exemplo

pf.setNome(p.getNome());
furacao123

Vou exemplificar o que realmente eu preciso

por exemplo tenho objto NFiscal que ao gerar uma NFiscal eu tenho de movimentar estoque entao tenho o objeto EstoqueMovimentacao que é qse uma replica de NFiscal mas dae entra o CupomFiscal que tb vai gerar um EstoqueMovimentacao mas que nao possui os mesmos dados de NFiscal entao tenho q fazer um adapter onde transformo qualquer objeto em um EstoqueMovimentacao entao fiz assim...

public interface EstoqueMovimentacaoInterface {

public abstract Integer getNumDoc();

public Double getVlIpi();

}

onde EstoqueMovimentacao implementa essa interface

crio um metodo abstrato para dizer que esse é obrigatorio e qualquer movimentacao precisa desse valor

NFiscal e CupomFiscal nao implementam de cara a interface pois cada um tem campos diferentes e iguais entao o adapter de cada um que ira implementar a interface

public abstract class InicializaMovimentacao implements EstoqueMovimentacaoInterface {
  
public Double getVlIcms() {
        return 0.00;
    }

}

por exemplo Cupom Fiscal nao tem valor ipi entao inicializo com 0

public class NFiscalAdapter extends InicializaMovimentacao {

private NFiscal nFiscal;

public NFiscalAdapter(NFiscal nFiscal) {
        super();
        this.nFiscal = nFiscal;
}

@Override
    public String getNumDoc() {
        return nFiscal.getNumNf().toString();
    }

}

Agora aqui vem a parte chata popular varios atributos sendo q o objeto que eu quero é identico a interface que o construtor recebe movInterface

public class EstoqueMovimentacaoFacade {

    private EstoqueMovimentacaoInterface movInterface;
    private EstoqueMovimentacao mov;
    private EstoqueMovimentacaoController controller;

    public EstoqueMovimentacaoFacade(EstoqueMovimentacaoInterface movInterface) {
        this.mov = new EstoqueMovimentacao();
        this.movInterface = movInterface;
    }

    private void popular() {

       /**** SETAR TODOS OS METODOS ****/
        mov.setNumDoc(movInterface.getNumDoc());
        mov.setVlIpi(movInterface.getVlIpi());
    }

    public void gerar() {
        popular();
        controller.grava(mov);
    }
}
Entao la na minha aplicaçao ao gerar uma NF
EstoqueMovimentacaoFacade facade = new EstoqueMovimentacaoFacade(new NFiscalAdapter(nFiscal));
         facade.gerar();

e assim eu gravo a NF e tb a movimentacao o que estou axando estranho é a parte de NFiscalAdapter implementar EstoqueMovimentacaoInterface e ao passar para EstoqueMovimentacaoFacade nao precisar setar cada atributo na mao no metodo popular

josemanzoli

http://www.guj.com.br/posts/list/37832.java

renanreismartins

antes de criar um modelo complexo de classes como esse, aconselho vc realmente estudar a fundo herança, polimorfismo… ja deu uma lidinha nas apostilas da caelum ?

abrasss

furacao123

eu vejo esse problema mais como Padrao de Projeto do que com polimorfismo ou herança, poois aqui eu preciso adaptar os objetos para funcionarem como uma movimentacao

josemanzoli

Cara analisa suas classes.

O EstoqueMovimentacaoFacade tem um construtor que recebe como parâmetro um EstoqueMovimentacaoInterface, toda classe que implementar essa interface vai ser aceita no construtor. Por isso!

A classe NFiscalAdapter herda tudo da classe InicializaMovimentacao que por sua vez implementa a EstoqueMovimentacaoInterface

No seu primeiro exemplo se você criar um construtor que receba uma Pessoa dentro do PessoaFisica você vai conseguir fazer o new PessoaFisica(Pessoa p)

PessoaFisica(Pessoa p){
        this.nome = p.getNome();
}

Mas não vejo nenhuma utilidade ou motivo para isso, mas como você queria tirar dúvidas acho que agora está explicado!

furacao123

mas eu preciso transformar NFiscal em EstoqueMovimentacao pra dae passar pro JPA salvar o estoqueMovimentacao

o mesmo seria um cupom fiscal eu adapto ele e transformo em EstoqueMovimentacao e passo pro JPA

assim o EStoqueMovimentacaoFacade tem de receber a interface pois pode vir de Cupom ou Nfiscal

digamos que eu tivesse um CupomFiscalAdapter eu passaria para o construtor do EstoqueMovimentacaoFacade
ele pega os valores da interface e popula o objeto EstoqueMovimentacao que é passado para o JPA

mas se eu tenho a interface e o objeto EstoqueMovimentacao tb implementa essa interface eu tenho mesmo que setar da maneira como o popula faz no facade?

furacao123

O EstoqueMovimentacaoFacade tem um construtor que recebe como parâmetro um EstoqueMovimentacaoInterface, toda classe que implementar essa interface vai ser aceita no construtor. Por isso!

A classe NFiscalAdapter herda tudo da classe InicializaMovimentacao que por sua vez implementa a EstoqueMovimentacaoInterface

realmente bobiei nessa estava tentando implementar um encapsulamento para que fosse obrigado dar corpo a tais metodos mas no fim nao preciso de mais nehuma interface todo problema se resolve com apenas heranças, amanha pela manha posto a resolução que cheguei para ser analizada

Obrigado a todos :smiley:

Criado 28 de outubro de 2010
Ultima resposta 28 de out. de 2010
Respostas 12
Participantes 5