Setar objeto herdado de uma classe

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

[code]public class Pessoa {

private String nome;

public Pessoa() {
}

public String getNome() {
    return nome;
}

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

}[/code]

e uma classe PessoaFisica que extends Pessoa

[code]
public class PessoaFisica extends Pessoa {

private String cpf;

public PessoaFisica() {
    super();
}

public String getCpf() {
    return cpf;
}

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

}[/code]

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

[code]
public static void main(String[] args) {

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

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

    pf = p;

}[/code]

sem precisar fazer set em cada atributo?

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.

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?

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

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;

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

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…

[code]public interface EstoqueMovimentacaoInterface {

public abstract Integer getNumDoc();

public Double getVlIpi();

}[/code]

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

[code]public abstract class InicializaMovimentacao implements EstoqueMovimentacaoInterface {

public Double getVlIcms() {
return 0.00;
}

}[/code]

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

[code]public class NFiscalAdapter extends InicializaMovimentacao {

private NFiscal nFiscal;

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

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

}[/code]

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

[code]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);
}

}[/code]

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

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

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

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

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!

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?

[quote]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[/quote]

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: