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