Herança + Persistencia Hibernate

Boa Tarde!

Tenho uma classe
Pessoa

ID_PESSOA LONG
FLAG_CLIENTE STRING
FLAG_FORNECEDOR STRING

Criei mais 2 classe herdando a classe pessoa, CLIENTE E FORNECEDOR

Minha dúvida é o seguinte uma pessoa ela pode ser ao mesmo tempo CLIENTE E FORNECEDOR!

OU só cliente ou so Forncedor!

Fiz uma uma única tela e gostaria trabalhar como esses 3 classe ao mesmo tempo!

Alguma Sugestão?

PESSOA
|
| - Cliente
|
| - Fornecedor

prefira composição a Herença… principalmente quando pode ser os 2… com herança só pode ser 1

Nilodp,

O cenário que você descreveu foi este. Cliente e Fornecedor são especializações de Pessoa.


public class Pessoa{}

public class Cliente extends Pessoa {}

public class Fornecedor extends Pessoa {}

Princípios básicos de orientação a objeto, no que diz respeito herança simples, usando o cenário que você descreveu.

1 - Pessoa pode ser um Cliente ou pode ser um Fornecedor;
2 - Cliente é uma Pessoa e Fornecedor é uma Pessoa.

Para Pessoa ser Cliente e Fornecedor, deveria-se aplicar herança múltipla, tal como abaixo:


public class Pessoa extends Cliente, Fornecedor {}

public class Cliente {}

public class Fornecedor {}

Entretanto, Java NÃO suporta tal tipo de herança.

Herança múltipla pode ser resolvida de outras maneiras, por exemplo, através da aplicação do padrão delegate.

Algumas analistas/desenvolvedores dizem que herança múltipla pode ser feita com interfaces, como abaixo:


public interface Cliente { }

public interface Fornecedor { }

public class Pessoa implements Cliente, Fornecedor { }

De fato, isso aí é válido em sintaxe, mas não se trata de herança por extensão/especialização. Esse tipo de herança é chamada de herança por implementação, ou seja, quando você diz que Pessoa herda por implementação Cliente e Fornecedor, quer dizer que vc é obrigado a implementar todos os métodos de Cliente e Fornecedor em Pessoa.

A menos que Pessoa seja uma classe abstrata, entretanto a primeira classe concreta que herdar Pessoa será obrigado a implementar todos os métodos definidos na interface que ainda não foram implementadados, como abaixo:


public interface Cliente {

    void fazAlgumaCoisa();

}

public interface Fornecedor {

    void fazAlgumaOutraCoisa();

}

public abstract class Pessoa implements Cliente, Fornecedor {

    public void fazVariasOutrasCoisas() {
        System.out.println("Estou fazendo VÁRIAS OUTRAS coisas.....");
    }

}

public class PessoaConcreta extends Pessoa {

    public void fazAlgumaCoisa() {
        System.out.println("Estou fazendo alguma coisa.....");
    }

    public void fazAlgumaOutraCoisa() {
        System.out.println("Estou fazendo alguma OUTRA coisa.....");
    }
  
}

Isto está relacionado a especificação de um modelo, ou seja, um contrato que especifica o mínimo necessário para que seu modelo funcione adequadamente como projetado.

Já a herança está relacionada as práticas de reuso de código e polimorfismo.

@braços